考虑以下代码:
greet <- function(object) {
greeting <- "hola"
UseMethod("greet", object)
}
greet.character <- function(object)
paste(greeting, object)
greet("stackoverflow")
#> [1] "hola stackoverflow"
由reprex包(v0.3.0)创建于2021-02-03
显然,greet.character
方法的执行环境是在UseMethod()
之前用泛型中创建的变量填充的,因此代码按预期工作。
但是,在包中包含这些定义将导致R CMD检查时的以下说明:
> checking R code for possible problems ... NOTE
greet.character: no visible binding for global variable ‘greeting’
Undefined global functions or variables:
greeting
您可以在这个存储库中找到一个示例包来说明这个问题。
现在,我知道我可以用globalVariables()
关闭NOTE,但我仍然对最初的NOTE的来源感到困惑。所以我的问题是:
上面的例子是否有什么内在的原因应该被认为是"不良做法"?在R包里?在实际示例中,我使用这样的结构来避免几个方法中的代码重复。
如果没有,还有比
globalVariables()
更好的选择吗?
回答我自己,我认为这种做法会导致混乱的行为,因为UseMethod()
产生适当的方法调用其相同的参数;这意味着对是泛型参数的变量的修改(不像我上面的例子中的greeting
)不会传播到方法。
现在我定义了额外的函数,要在每个方法的开始调用,以执行我最初在泛型中做的复杂计算。如果这些函数需要很多参数,这也会导致代码的繁琐,但这是目前为止我找到的最好的解决方案。
我将把这个问题保留一段时间,看看是否有人有其他方法可以提出。