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 检查:全局变量没有可见绑定(使用包中的数据/数据集时)

在 R 中,是不是可以禁止“注意:全局变量没有可见绑定”?

dplyr 。和 _no 对全局变量 '.' 的可见绑定 _ 包检查中的注意事项

“中位数”没有可见的全局函数定义

PHP中的超级全局变量

创建新的 R 包时如何修复“没有可见的全局函数定义”