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

Sac*_*amp 42 r package

我注意到在检查一个包时,我获得了"全局变量没有可见绑定"的注释,当我使用类似函数时subset,使用列表元素的逐字名称作为参数.

例如,使用数据框:

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

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

subset(foo,a)
transform(foo,a=b)
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*wle 44

为了让它过去R CMD check你可以:

  • 使用get("b")(但这是繁重的)
  • 放置a=b=NULL在你的函数中较高(这就是我)

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

编辑:

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

  • @MattDowle看起来与C变量声明相反,因为它对用户说"这些是NULL",实际上该函数将依赖于它们不是NULL来访问. (3认同)
  • 谢谢,在 data.table 驱动函数中使用 `:=` 时,这个问题困扰了我很长时间。 (2认同)

Jos*_*ich 17

subset是非交互式使用的潜在"意外后果"之一.如警告部分所述?subset:

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

  • 认为这个问题可能比"子集"更普遍.我已经看过几次了. (5认同)
  • 对于健壮的函数,请避免调用使用非标准求值的函数. (4认同)
  • @hadley,但是对'foreach`的调用呢?......这些仍然会引起同样的注释. (3认同)

sea*_*ody 11

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

if(getRversion() >= "2.15.1")  utils::globalVariables(c("a", "othervar"))
Run Code Online (Sandbox Code Playgroud)

  • yikes ..这是一个非常副作用,只是为了正确评估假子集...如果CRAN只允许作者将关于明显(但实际上)丢失的全局变量的注释标记为假的,那就太好了...... (5认同)

tek*_*ara 9

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

我会替换像这样的命令

subset(foo,a)

foo[foo$a]

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

foo[foo$a, ]

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

with(foo, foo[a, ])