我注意到在检查一个包时,我获得了"全局变量没有可见绑定"的注释,当我使用类似函数时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,但这没关系.
Jos*_*ich 17
这subset
是非交互式使用的潜在"意外后果"之一.如警告部分所述?subset
:
这是一种便于交互使用的便利功能.对于编程,最好使用标准的子集函数,如'[',特别是参数'子集'的非标准评估可能会产生意想不到的后果.
sea*_*ody 11
从R版本2.15.1起,有一种解决方法:
if(getRversion() >= "2.15.1") utils::globalVariables(c("a", "othervar"))
Run Code Online (Sandbox Code Playgroud)
根据警告部分,?subset
最好以交互方式使用子集,并[
进行编程.
我会替换像这样的命令
subset(foo,a)
同
foo[foo$a]
或者如果foo是一个数据帧:
foo[foo$a, ]
您可能还想使用with
if foo是一个数据帧并且要评估的表达式很复杂:
with(foo, foo[a, ])
归档时间: |
|
查看次数: |
9651 次 |
最近记录: |