编辑:哈德利威克姆指出我错过了.R CMD检查是投掷NOTES,而不是警告.我非常抱歉这种混乱.这是我的疏忽.
R CMD check每次我在ggplot2中使用合理的绘图创建语法时都会抛出此注释:
no visible binding for global variable [variable name]
Run Code Online (Sandbox Code Playgroud)
我理解为什么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))
)
)
}
Run Code Online (Sandbox Code Playgroud)
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'
Run Code Online (Sandbox Code Playgroud)
检查在技术上是正确的.x.values和y.values
JitteredResponsesByContrast()x.values <- [something]全局或调用者在表单中预定义的.相反,它们是先前定义并传递给函数的数据框中的变量JitteredResponsesByContrast().
ggplot2似乎鼓励使用data参数.据推测,数据参数是此代码执行的原因
library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()
Run Code Online (Sandbox Code Playgroud)
但是这段代码会产生一个对象未找到的错误:
library(ggplot2)
hwy # a variable in the mpg dataset
Run Code Online (Sandbox Code Playgroud)
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))
)
)
}
Run Code Online (Sandbox Code Playgroud)
我很欣赏这个解决方案,但我不喜欢它有三个原因.
R CMD check.aes()调用将看到我们现在的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))
)
}
)
}
Run Code Online (Sandbox Code Playgroud)
此解决方案有效.但是,我不喜欢这种解决方案,因为它甚至没有像我期望的那样工作.如果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
Run Code Online (Sandbox Code Playgroud)
所以,再次,我认为这个解决方案与NULLing策略有类似的缺陷:
with()调用中包装逻辑with()电话有误导性.我仍然需要提供一个data =论点; 一切with()都在安抚R CMD check.我看到它的方式,我可以采取三种选择:
with()块)三者都不让我高兴,我想知道人们建议我(以及其他想要利用ggplot2的软件包开发者)应该做些什么.感谢所有提前.我非常感谢你甚至通过这个阅读:-)
had*_*ley 82
你有两个解决方案:
重写您的代码以避免非标准评估.对于ggplot2,这意味着使用aes_string()而不是aes()(如Harlan所述)
将呼叫添加到globalVariables(c("x.values", "y.values"))程序包顶级的某个位置.
在提交给CRAN时,你应该在你的包中争取0注意,即使你必须做一些有点hacky的事情.这使CRAN的生活更轻松,也更容易.
(2014-12-31更新以反映我对此的最新想法)
Har*_*lan 42
你尝试过aes_string而不是aes吗?这应该工作,虽然我没有尝试过:
aes_string(x = 'x.values', y = 'y.values')
Run Code Online (Sandbox Code Playgroud)
Pau*_*ain 15
在 2019 年,解决此问题的最佳方法是使用包中的.data前缀rlang。这告诉 R 将x.values和y.values视为 a 中的列data.frame(因此它不会抱怨未定义的变量)。
注意:如果您知道数据输入中存在预定义的列名称,则此方法效果最佳
#' @importFrom rlang .data
my_func <- function(data) {
ggplot(data, aes(x = .data$x, y = .data$y))
}
Run Code Online (Sandbox Code Playgroud)
Bas*_*ast 12
如果
getRversion() >= "3.1.0"
Run Code Online (Sandbox Code Playgroud)
您可以在包的顶层添加呼叫:
utils::suppressForeignCheck(c("x.values", "y.values"))
Run Code Online (Sandbox Code Playgroud)
从:
help("suppressForeignCheck")
Run Code Online (Sandbox Code Playgroud)
将此行代码添加到您提供包级文档的文件中:
if(getRversion() >= "2.15.1") utils::globalVariables(c("."))
Run Code Online (Sandbox Code Playgroud)
示例在这里