编辑:哈德利·维克汉姆指出我说错了。R CMD检查抛出NOTES,而不是警告。非常抱歉给您造成了混乱。这是我的疏忽。
每次在ggplot2中使用合理的情节创建语法时,R CMD check
都会抛出这个注释:
no visible binding for global variable [variable name]
我理解为什么R CMD检查这样做,但它似乎是犯罪的整个脉络,否则明智的语法。我不确定要采取什么步骤来让我的包通过R CMD check
并被CRAN录取。
Sascha Epskamp之前在本质上是同一个问题上发表过文章。我认为,区别在于subset()
的manpage 说它是为交互使用而设计的. xml。
在我的例子中,问题不是关于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'
这张支票在技术上是正确的。x.values
和y.values
JitteredResponsesByContrast()
中局部定义的x.values <- [something]
形式中预定义的,无论是全局的还是调用者的。相反,它们是先前定义并传递给函数JitteredResponsesByContrast()
的数据帧中的变量。
ggplot2似乎鼓励使用data
参数。data参数大概是执行这段代码的原因
library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()
但是这代码将产生一个object-not-found错误:
library(ggplot2)
hwy # a variable in the mpg dataset
马修·道尔推荐首先将有问题的变量设置为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()
调用将看到我们的now-NULL变量的期望(它不会),同时模糊了真正的目的(使R CMD检查意识到它显然不知道被绑定的变量)你可以使用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策略有类似的缺陷:
with()
调用中with()
调用具有误导性。我仍然需要提供一个data =
参数;所有with()
所做的是安抚R CMD check
。在我看来,我有三个选择:
with()
块)修复我的代码这三种方法都不能让我满意,我想知道人们建议我(以及其他想利用ggplot2的包开发人员)应该做什么。