R语言 如何将新泛型的附加参数设置为与它们在default方法中的默认值相同

wbrvyc0a  于 2023-05-11  发布在  其他
关注(0)|答案(2)|浏览(134)

当为新类实现泛型方法时:

scale.newclass <- function(x, center = TRUE, scale = TRUE) {
    ...
}

如何保证附加参数centerscale的默认值始终与scale.default中的默认值保持一致?
换句话说,如果将来scale.default将其默认参数更改为scale = FALSE,如何确保scale.newclass的默认值也进行了调整以匹配?

mcdcgff0

mcdcgff01#

这些值似乎不太可能发生变化,但如果您真的担心,您可以这样做

scale.newclass <- function(x, center = formals(scale.default)$center, scale = formals(scale.default)$scale) {
    ...
}

它将从函数签名中读取默认值。

bejyjqdl

bejyjqdl2#

方法scale.default从泛型函数scale继承其参数的默认值:

identical(formals(scale), formals(scale.default))
## [1] TRUE

除非泛型函数发生变化,否则这些值不会发生变化,如果泛型函数发生变化,则R CMD check会警告您不一致。所以这个例子并不能很好地激发问题…
撇开这一点不谈,你可以通过编程方式使用formals<-来实现这一点:

formals(scale.a) <- formals(scale.default)

好吧,这只适用于不接受形式参数...的泛型函数:

any(names(formals(scale)) == "...")
## [1] FALSE

一般来说,两个方法的形式可能不具有相同的长度或相同的名称,在这种情况下,您需要更加小心:

f <- function(x, ...) UseMethod("f")
f.default <- function(x, a = 1, b = 2, c = a + b, ...) x
f.a       <- function(x, a = 1, b = 1, c = a - b, ...) x

form.default <- formals(f.default)
form.a       <- formals(f.a)

nms <- intersect(names(form.default), names(form.a))
formals(f.a)[nms] <- form.default[nms]

identical(formals(f.a), form.default)
## [1] TRUE

尽管如此,我的感觉是,从长远来看,这些种类的“预防措施”可能会引起比它们解决的问题更多的问题...

相关问题