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, ])