首页 文章

全局变量没有可见的绑定在R CMD检查中注意

提问于
浏览
37

当我使用像 subset 这样使用列表元素的逐字名称作为参数的函数时,我注意到在检查包时我获得了注释"no visible binding for global variable" .

例如,使用数据框:

foo < - data.frame(a = c(TRUE,FALSE,TRUE),b = 1:3)

我可以做愚蠢的事情,比如:

subset(foo,a)
transform(foo,a=b)

哪个工作如预期 . 然而,R CMD中的R代码检查不理解这些引用元素并且抱怨没有任何可见的全局变量绑定 .

虽然这个工作正常,但我真的不喜欢在我的包中加注,并且更喜欢它通过检查而没有任何错误,警告和注释 . 我也不想过多地修改我的代码 . 有没有办法编写这些代码,以便明确参数不引用全局变量?

4 回答

  • 9

    为了让它超过 R CMD check ,您可以:

    • 使用 get("b") (但这很麻烦)

    • a=b=NULL 放置在你的功能更高的地方(这就是我所做的)

    前一段时间r-devel上有一个帖子,其中来自r-core的人基本上说(来自记忆)“注意是好的,你知道 . 假设是作者检查了它并且没有注意 . ” . 但是,我同意你的看法 . 我更喜欢让CRAN检查在所有平台上都返回一个干净的“OK” . 这样,用户毫无疑问地通过了检查确定 .

    编辑:

    这是r-devel thread我记得(从2010年4月起) . 所以这似乎表明在某些情况下没有已知的方法来避免NOTE,但这没关系 .

  • 11

    这是非交互式使用 subset 的潜力之一 . 正如 ?subset 的警告部分所述:

    这是一种便于交互使用的便利功能 . 对于编程,最好使用标准的子集函数,如'[',特别是参数'子集'的非标准评估可能会产生意想不到的后果 .

  • 17

    从R版本2.15.1起,有一种解决方法:

    if(getRversion() >= "2.15.1")  utils::globalVariables(c("a", "othervar"))
    
  • 42

    根据 ?subset 的警告部分,最好以交互方式使用子集,并使用 [ 进行编程 .

    我会替换像这样的命令

    subset(foo,a)

    foo[foo$a]

    或者如果foo是一个数据帧:

    foo[foo$a, ]

    您可能还想使用 with 如果foo是一个数据帧并且要评估的表达式很复杂:

    with(foo, foo[a, ])

相关问题