EDIT: Hadley Wickham points out that I misspoke. R CMD check is throwing NOTES, not Warnings. I'm terribly sorry for the confusion. It was my oversight.

简本

每次我在ggplot2中使用sensible plot-creation syntax时,R CMD check都会抛出这个注释:

no visible binding for global variable [variable name]

我理解为什么R CMD check会这样做,但它似乎将所有其他合理的语法都定为犯罪.我不确定该采取什么措施才能让我的包裹通过R CMD check分并进入CRAN.

背景

Sascha Epskamp之前发布在essentially the same issue上.我认为,区别在于subset()的主页是says it's designed for interactive use.

在我的例子中,问题不是超过subset(),而是超过了ggplot2的一个核心特征:data =参数.

我编写的生成这些注释的代码示例

下面是my package中的a sub-function,它为绘图添加了点:

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.valuesy.values

  • 不是在函数JitteredResponsesByContrast()中本地定义的
  • 不是在表单x.values <- [something]中全局或调用方中预定义的.

相反,它们是数据帧中的变量,该数据帧在前面定义并传递到函数JitteredResponsesByContrast()中.

为什么ggplot2难以安抚R CMD判断

ggplot2似乎鼓励使用data参数.数据参数大概就是执行此代码的原因

library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()

this代码将生成一个未找到的对象错误:

library(ggplot2)
hwy # a variable in the mpg dataset

两个变通办法,为什么我对两个都不满意

抵消策略

Matthew Dowle recommends首先将有问题的变量设置为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))
    )
  )
}

我欣赏这个解决方案,但我不喜欢它有三个原因.

  1. 除了安抚R CMD check人之外,它没有其他用途.
  2. 这并不反映意图.它提高了aes()调用将看到我们现在的空变量的期望(它不会),同时模糊了真正的目的(使R CMD check知道它显然不知道的变量是绑定的)
  3. 1和2的问题会成倍增加,因为每次编写返回plot元素的函数时,都必须添加一个令人困惑的null语句

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()真的解决了将解释器指向变量所在位置的问题,那么我甚至不应该need 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

因此,我再次认为,这种解决方案与零位策略有类似的缺陷:

  1. 我仍然需要遍历每个plot元素函数,并将逻辑封装在一个with()调用中
  2. with()个电话有误导性.我仍然需要提供data =个论点;with()人所做的只是安抚R CMD check人.

结论

在我看来,我有三个 Select :

  1. 游说克兰忽略这些笔记,辩称它们是"虚假的"(根据CRAN policy),并在每次我提交包裹时都这样做
  2. 用两种不受欢迎的策略之一(置零或with()块)修复我的代码
  3. 大声哼唱,希望问题消失

这三个都不能让我高兴,我想知道人们建议我(以及其他想要进入ggplot2的包开发人员)应该做什么.

推荐答案

你试过用aes_string而不是aes吗?这应该行得通,尽管我还没试过:

aes_string(x = 'x.values', y = 'y.values')

R相关问答推荐

r带有参考年的两年移动平均线

为什么stat_bin在R中的ggplot中显示错误的数字?

创建重复删除的唯一数据集组合列表

向gggplot 2中的数据和轴标签添加大写和星号

Highcharter多次钻取不起作用,使用不同方法

用derrr在R中查找组间的重复项

为什么在ggplot2中添加geom_text这么慢?

使用case_match()和char数组重新编码值

在某些栏和某些条件下,替换dfs列表中的NA

在ggplot中为不同几何体使用不同的 colored颜色 比例

哪一行和行和 Select 特定行,但是考虑到Nas

如何在R库GoogleDrive中完全删除预先授权的Google帐户?

如何将Which()函数用于管道%>;%

有没有可能用shiny 的书签恢复手风琴面板?

如何在使用箭头R包(箭头::OPEN_DATASSET)和dplyr谓词时编写具有整齐计算的函数?

如果COLSUM为>;0,则COLNAME为向量

如何将一个方阵分解成没有循环的立方体

根据r中每行中的日期序列,使用列名序列创建新列

通过R:文件名未正确写入[已解决]将.nc文件转换和导出为.tif文件

在ggplot2图表中通过端点连接点