编辑:Hadley Wickham指出我误会了。R CMD检查正在抛出注释,而不是警告。对此我感到非常抱歉。这是我的疏忽。
短版
R CMD check
每当我在ggplot2中使用明智的绘图创建语法时,都会抛出此注释:
no visible binding for global variable [variable name]
我理解为什么R CMD检查可以做到这一点,但是它似乎将其他本来可以理解的语法定为犯罪。我不确定要采取什么步骤使我的包裹通过R CMD check
并被CRAN录取。
背景
Sascha Epskamp此前曾发表过关于同一问题的报道。我认为,区别在于手册subset()
页上说它是为交互使用而设计的。
就我而言,这个问题还没有结束subset()
,但超过的核心功能ggplot2
:该data =
参数。
我编写的生成这些注释的代码示例
JitteredResponsesByContrast <- function (data) {
return(
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
)
}
R CMD check
,在解析此代码时,会说
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'x.values'
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'y.values'
为什么R CMD检查正确
该检查在技术上是正确的。x.values
和y.values
- 不在函数中本地定义
JitteredResponsesByContrast()
- 既未在
x.values <- [something]
全局中也未在调用方中预先定义。
相反,它们是数据帧中的变量,该变量早先定义并传递到function中JitteredResponsesByContrast()
。
为什么ggplot2难以安抚R CMD检查
ggplot2似乎鼓励使用data
参数。大概是data参数,这就是为什么要执行此代码的原因
library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()
但是此代码将产生一个找不到对象的错误:
library(ggplot2)
hwy # a variable in the mpg dataset
两种解决方法,以及为什么我都不满意
归零策略
Matthew Dowle建议首先将有问题的变量设置为NULL,在我的情况下,它看起来像这样:
JitteredResponsesByContrast <- function (data) {
x.values <- y.values <- NULL # Setting the variables to NULL first
return(
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
)
}
我很欣赏这个解决方案,但是由于三个原因,我不喜欢它。
- 它除了满足感之外没有其他目的
R CMD check
。 - 它不反映意图。它提出了这样的期望:该
aes()
调用将看到我们现在为NULL的变量(不会),同时掩盖了真实的目的(使R CMD检查显然不是绑定的变量) - 1和2的问题成倍增加,因为每次编写返回图元素的函数时,都必须添加一个令人困惑的NULLing语句
with()策略
您可以使用with()
来明确表示可以在较大的环境中找到所讨论的变量。就我而言,使用with()
如下所示:
JitteredResponsesByContrast <- function (data) {
with(data, {
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
}
)
}
此解决方案有效。但是,我不喜欢这种解决方案,因为它甚至无法按我期望的方式工作。如果with()
是真正解决指着解释的变量在哪里的问题,那么我甚至不应该需要的data =
参数。但是,with()
这种方式不起作用:
library(ggplot2)
p <- ggplot()
p <- p + with(mpg, geom_point(aes(x = hwy, y = cty)))
p # will generate an error saying `hwy` is not found
因此,我再次认为此解决方案与NULLing策略具有类似的缺陷:
- 我仍然必须遍历每个plot元素函数并将逻辑包装在
with()
调用中 - 该
with()
电话具有误导性。我仍然需要提供一个data =
论点。一切with()
都在令人愉悦R CMD check
。
结论
从我的角度来看,我可以采取三种选择:
- 游说CRAN忽略这些注释,认为它们是“虚假的”(根据CRAN政策),并且每次我提交包裹时都要这样做
- 使用两种不良策略之一(NULL或
with()
块)修复我的代码 - 嗡嗡声真的很大,希望问题解决
这三个都不能让我感到高兴,我想知道人们建议我(以及希望利用ggplot2的其他软件包开发人员)应该做什么。在此先感谢所有。我真的很感谢您阅读本文章:-)
aes_string
transform
和subset
太(肯定不是100%,但它是有道理的)。