当我使用像subset
这样使用列表元素的逐字名称作为参数的函数时,我注意到在检查包中我获得了“没有可见的全局变量绑定”的注释。
例如,数据框:
foo< - data.frame(a = c(TRUE,FALSE,TRUE),b = 1:3)
我可以做傻事:
subset(foo,a)
transform(foo,a=b)
按预期工作。然而,R CMD中的R代码检查不理解这些引用元素并且抱怨没有任何可见的全局变量绑定。
虽然这可以正常工作,但我真的不喜欢在我的包裹中注明并且更喜欢它通过检查而没有任何错误,警告和注释。我也不想过多地修改我的代码。有没有办法编写这些代码,以便明确参数不引用全局变量?
答案 0 :(得分:43)
要超过R CMD check
,您可以:
get("b")
(但这很麻烦)a=b=NULL
放置在您的功能中更高的位置(这就是我所做的)前一段时间r-devel上有一个帖子,其中来自r-core的人基本上说(来自内存)“注意还可以,你知道。假设是作者检查了它并且可以使用NOTE。” 。但是,我同意你的看法。我更喜欢让CRAN检查在所有平台上都返回一个干净的“OK”。这样,用户毫无疑问地通过了检查确定。
编辑:
以下是我记得的r-devel thread(自2010年4月起)。所以这似乎表明在某些情况下没有已知的方法来避免NOTE,但这没关系。
答案 1 :(得分:17)
这是非交互式使用subset
的潜在“意外后果”之一。正如?subset
的警告部分所述:
这是一种便于交互使用的便利功能。对于 编程最好使用标准的子集函数 '[',特别是对论证的非标准评价 “子集”可能会产生意想不到的后果。
答案 2 :(得分:11)
从R版本2.15.1起,有一种解决方法:
if(getRversion() >= "2.15.1") utils::globalVariables(c("a", "othervar"))
答案 3 :(得分:9)
根据?subset
的警告部分,最好以交互方式使用子集,并[
进行编程。
我会替换像
这样的命令 subset(foo,a)
与
foo[foo$a]
或者如果foo是数据帧:
foo[foo$a, ]
如果foo是数据框并且要评估的表达式很复杂,您可能还想使用with
:
with(foo, foo[a, ])
答案 4 :(得分:0)
我遇到了这个问题,并将其追溯到我的ggplot2部分。
此代码提供了错误:
ggplot2::ggplot(data = spec.df, ggplot2::aes(E.avg, fraction)) +
ggplot2::geom_line() +
ggplot2::ggtitle(paste0(title))
将数据名称添加到参数中消除了否:
ggplot2::ggplot(data = spec.df, ggplot2::aes(spec.df$E.avg, spec.df$fraction)) +
ggplot2::geom_line() +
ggplot2::ggtitle(paste0(title))