首页 > 解决方案 > 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 年 2 月 3 日创建

显然,greet.charactermethod 的执行环境填充了泛型 before 中创建的变量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

您可以在此存储库中找到说明该问题的示例包。

现在,我知道我可以用 关闭 NOTE globalVariables(),但我仍然对 NOTE 的起源感到困惑。所以我的问题是:

  1. 为什么上面的例子应该被认为是 R 包中的“不好的做法”,有什么内在的原因吗?在现实生活中的示例中,我使用这样的构造来避免几种方法中的代码重复。

  2. 如果没有,有没有比使用更好的选择globalVariables()

标签: rpackagecran

解决方案


回答我自己,我认为这种做法会导致令人困惑的行为,因为会UseMethod()生成具有相同参数的适当方法的调用;暗示对作为泛型参数的变量的修改不像greeting我上面的示例)不会传播到方法。

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

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


推荐阅读