R CMD检查中的全局变量注释没有可见的绑定
Posted
技术标签:
【中文标题】R CMD检查中的全局变量注释没有可见的绑定【英文标题】:No visible binding for global variable Note in R CMD check 【发布时间】:2011-12-27 03:13:24 【问题描述】:我在检查一个包时注意到,当我使用 subset
之类的函数将列表元素的逐字名称用作参数时,我得到了“全局变量没有可见绑定”的注释。
以数据框为例:
foo
我可以做一些愚蠢的事情,比如:
subset(foo,a)
transform(foo,a=b)
按预期工作。然而,R CMD 中的 R 代码检查不理解这些引用元素并抱怨没有任何可见的全局变量绑定。
虽然这工作正常,但我真的不喜欢在我的包裹中有注释,而是希望它通过检查,完全没有错误、警告和注释。我也不想过多地修改我的代码。有没有办法编写这些代码,以便明确参数不引用全局变量?
【问题讨论】:
为了未来的 R 进化,这可能有一些理由让包“更可编译”...... 我注意到这个问题最近被重复了:***.com/questions/9439256/… 但那里的答案有其他人可能会觉得有用的更多信息。 How can I handle R CMD check "no visible binding for global variable" notes when my ggplot2 syntax is sensible?的可能重复 【参考方案1】:要通过R CMD check
,您可以:
get("b")
(但这很麻烦)
将a=b=NULL
放在函数中更高的位置(我就是这样做的)
前段时间在 r-devel 上有一个帖子,来自 r-core 的某个人基本上说(从记忆中)“NOTES 没问题,你知道。假设作者检查了它并且对 NOTE 没问题。” .但是,我同意你的看法。我更喜欢让 CRAN 检查在所有平台上返回一个干净的“OK”。这样用户就可以毫无疑问地通过检查。
编辑:
这是我记得的r-devel thread(从 2010 年 4 月开始)。所以这似乎表明在某些情况下没有已知的方法可以避免注意,但这没关系。
【讨论】:
谢谢。在我有时间以适当的方式重新编码之前,我将使用它:) 我不确定是否有合适的方法 ;) 我认为a=b=NULL
就像 C 变量声明一样。它让我想得更努力一些,并且为我发现了一些错误,所以我不介意。
@MattDowle 似乎与 C 变量声明相反,因为它对用户说“这些是 NULL”,而实际上函数将依赖它们在访问时不是 NULL。
谢谢,在data.table驱动函数中使用:=
时,这个问题困扰了我很久。
根据this post,使用@seancarmody 的答案中概述的utils::globalVariables()
是解决此问题的正确方法。【参考方案2】:
这是以非交互方式使用subset
的潜在“意外后果”之一。正如?subset
的警告部分所说:
这是一个旨在以交互方式使用的便利功能。为了 编程最好使用标准的子集功能,如 ‘[’,尤其是参数的非标准评估 “子集”可能会产生意想不到的后果。
【讨论】:
认为这个问题可能比subset
更笼统。我已经看过几次了。
对于健壮的函数,避免调用使用非标准评估的函数。
@hadley,但是对foreach
的调用呢?...这些仍然会引起同样的注意。
@StevieP 你找到解决方案了吗?【参考方案3】:
从 R 版本 2.15.1 开始,有一种解决方法:
if(getRversion() >= "2.15.1") utils::globalVariables(c("a", "othervar"))
【讨论】:
yikes.. 这只是为了伪造子集被正确评估的副作用...... 【参考方案4】:根据?subset
的警告部分,最好以交互方式使用子集,[
用于编程。
我会替换一个类似的命令
subset(foo,a)
与
foo[foo$a]
或者如果 foo 是一个数据框:
foo[foo$a, ]
如果 foo 是一个数据框并且要评估的表达式很复杂,您可能还想使用 with
:
with(foo, foo[a, ])
【讨论】:
我很确定with
会导致完全相同的问题,因为a
仍未在环境中定义,仅在数据中。【参考方案5】:
我遇到了这个问题并将其追溯到我的 ggplot2 部分。
此代码提供了错误:
ggplot2::ggplot(data = spec.df, ggplot2::aes(E.avg, fraction)) +
ggplot2::geom_line() +
ggplot2::ggtitle(paste0(title))
将数据名称添加到参数中消除了not:
ggplot2::ggplot(data = spec.df, ggplot2::aes(spec.df$E.avg, spec.df$fraction)) +
ggplot2::geom_line() +
ggplot2::ggtitle(paste0(title))
【讨论】:
以上是关于R CMD检查中的全局变量注释没有可见的绑定的主要内容,如果未能解决你的问题,请参考以下文章
R CMD 检查:全局变量没有可见绑定(使用包中的数据/数据集时)