R CMD检查注意:' No visible binding for global variable ',当在S3泛型中



考虑以下代码:

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的来源感到困惑。所以我的问题是:

  1. 上面的例子是否有什么内在的原因应该被认为是"不良做法"?在R包里?在实际示例中,我使用这样的结构来避免几个方法中的代码重复。

  2. 如果没有,还有比globalVariables()更好的选择吗?

回答我自己,我认为这种做法会导致混乱的行为,因为UseMethod()产生适当的方法调用其相同的参数;这意味着对泛型参数的变量的修改(不像我上面的例子中的greeting)不会传播到方法。

现在我定义了额外的函数,要在每个方法的开始调用,以执行我最初在泛型中做的复杂计算。如果这些函数需要很多参数,这也会导致代码的繁琐,但这是目前为止我找到的最好的解决方案。

我将把这个问题保留一段时间,看看是否有人有其他方法可以提出。

最新更新