2014-09-25 38 views
3

我已经对这个错误做了相当多的研究,并且在所有其他情况下,似乎在缺少括号或paren时会显示此错误。但是,我已经搜遍了我的代码,而且我没有看到任何地方。看起来代码并没有在抛出错误之前读取完整的aes对象:非二进制运算符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)) 

我没有得到这个代码的任何错误,它按预期工作。

+0

阅读'?aes_string'。 – joran 2014-09-25 17:32:06

+0

另外,您可能想要避免使用'+',使用'list(geom_xxx(),geom_yyy ())''而不是 – baptiste 2014-09-25 17:34:35

+0

谢谢!baptiste得到这个错误消失了,然后它没有正确的读取我的输入,这是通过切换到aes_string来修复的。我现在唯一的问题是annotate()函数是没有阅读功能输入任何想法? – emilylinndb 2014-09-25 17:48:30

回答

2

完整的解决方案在此,感谢巴蒂斯特和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对象之间+语法来创建列表改变。仅当从返回的对象调用这些对象时,我使用了结果[[i]]。这删除了我报告的原始错误。接下来的问题是,它不能识别我的函数输入labelx,并且不太合适。
  • 从aes()更改为aes_string()以获取识别函数输入的函数。
  • 最后,注释未识别功能输入。更改为geom_text,如上面所写,以解决问题。 (也添加了偏移功能,所以我的标签不在最上面)
  • 相关问题