【问题标题】:Non-numeric argument to binary operator aes function二元运算符 aes 函数的非数字参数
【发布时间】:2014-09-25 17:31:25
【问题描述】:

我已经对此错误进行了大量研究,在所有其他情况下,似乎在缺少括号或括号时会出现此错误。但是,我已经搜索了我的代码,但我在任何地方都没有看到。在抛出错误之前,代码似乎没有读取我的完整 aes 对象:

我正在创建一个函数,该函数将创建一个 ggplot 对象,该对象在我的图表上绘制参考线和注释。这是函数:

create_geom_segments <- function(labelx, labely, text_label, color) {
 geom_obj <- (
  geom_segment(aes(x=0, y=labely, xend =labelx, yend=labely), col = color, linetype = "dashed") + 
  geom_segment(aes(x=labelx, y=0,xend=labelx, yend=labely), col = color, linetype = "dashed") +
  annotate("text", x=labelx, y=labely + 3, label=text_label) 
)

return(geom_obj)    
}

当我使用通用输入运行它时,例如

test <- create_geom_segments(0,10, "test", "red")

我明白了:

Error in geom_segment(mapping = aes(x = 0, y = labely, xend = labelx,  : 
non-numeric argument to binary operator

在使用此函数在函数之外成功创建这些对象后,我正在构建此函数:

new_graph <- (p + geom_segment(aes(x=0,y = x, xend = days_x, yend =x), col = "red", linetype = 'dashed')  + geom_segment(aes(x=days_x, y = 0, xend = days_x, yend = x)
          , col = "red", linetype = 'dashed') + annotate("text", x= days_x, y = x + 3, label = text ))

我没有收到此代码的任何错误,它按预期工作。

【问题讨论】:

  • 另外,您可能想避免使用+,而是使用list(geom_xxx(), geom_yyy())
  • 谢谢,两位! baptiste 让这个错误消失了,然后它没有正确读取我的输入,这通过切换到 aes_string 来修复。我现在唯一的问题是 annotate() 函数没有读取函数输入。有什么想法吗?
  • annotate 只是一个 geom 的封装,inherit.aes=FALSE,你可以用合适的 geom 层替换它。
  • 您可能想在下面发布您的解决方案并接受它。
  • 谢谢,这是我第一次发帖

标签: r ggplot2


【解决方案1】:

这里有完整的解决方案,感谢 baptiste 和 joran:

create_geom_segments <- function(labelx, labely, text_label, line_color, xoffset, yoffset) {
geom_obj <- list(
geom_segment(aes_string(x=0, y=labely, xend =labelx, yend=labely), col =
    line_color, linetype =      "dashed"),
geom_segment(aes_string(x=labelx, y=0,xend=labelx, yend=labely), col =
    line_color, linetype = "dashed"),
geom_text(aes_string(x=labelx + xoffset, y=labely + yoffset), 
    label = text_label, data = data.frame()) 
)
return(geom_obj)    
}

所做的更改:

  • 从在 geom_segment 对象之间使用 + 语法更改为创建列表。仅供参考,从返回的对象调用这些对象时,我使用了 result[[i]]。这消除了我报告的原始错误。下一个问题是它无法识别我的函数输入 labelx 和 labely。
  • 从 aes() 更改为 aes_string() 以获取函数以识别函数输入。
  • 最后,注释无法识别函数输入。更改为 geom_text 如上所述进行修复。 (还为函数添加了偏移量,因此我的标签不在行的顶部。
  • 【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 2016-07-23
      相关资源
      最近更新 更多