R CMD检查中没有可见的全局variables注释

我注意到当我使用像使用列表元素的逐字列名作为参数的subset函数时,我在检查一个包时得到的注释是“没有可见的全局variables绑定”。

例如对于一个dataframe:

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

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

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

哪些按预期工作。 R CMD中的R代码检查并不理解这些引用了元素,并且抱怨没有任何可见的全局variables绑定。

虽然这工作正常,我真的不喜欢有在我的包中的笔记,并希望它通过检查没有错误,警告和笔记。 我也不是真的想重写我的代码太多。 有没有办法写这些代码,以便清楚的参数不指向全局variables?

通过R CMD check你可以:

  • 使用get("b") (但那很麻烦)
  • a=b=NULL放在函数中更高的位置(这就是我所做的)

前一段时间,r-devel上有一个线程,r-core的某个人基本上(从记忆中)说:“NOTES是可以的,你知道的,假设是作者检查了它并且与NOTE相符。 但是,我同意你的看法。 我宁愿让CRAN检查在所有平台上都返回干净的“OK”。 这样用户就可以毫无疑问地通过检查。

编辑:

这是我记忆中的r-devel线程 (从2010年4月起)。 所以这似乎表明,有些情况下,没有已知的方法来避免注,但没关系。

这是非交互式使用subset潜在的“意料之外的后果”之一。 正如它在“ ?subset的“警告”部分所述:

这是一个交互式使用的便利function。 对于编程,最好使用像'['这样的标准子集函数,特别是参数'子集'的非标准评估可能会有意想不到的后果。

从R版本2.15.1开始有一个解决方法:

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

按照?subset的警告部分,交互式地使用子集和[编程。

我会replace一个像

subset(foo,a)

foo[foo$a]

或者如果foo是一个dataframe:

foo[foo$a, ]

如果foo是数据框,并且要评估的expression式很复杂,您可能还想使用它:

with(foo, foo[a, ])