二元运算符的非数字参数

时间:2014-02-04 18:25:29

标签: r ggplot2

我正在尝试在R中创建我的第一个函数。该函数应该接收数据帧,数据帧中的x系列,数据帧中的y系列,以及绘制散点图。看起来很简单,但是当我尝试检查可选的布尔参数时遇到了麻烦。

R脚本

plotScatterChart <- function(data,x,y,scale=y,line=FALSE) {

    require(ggplot2)
    data$x <- as.numeric(x)
    data$y <- as.numeric(y)

    plot <- ggplot(data, aes(x, y)) + 
            geom_point() +  # aes(alpha=0.3,color=scale)
            #scale_color_gradient(high="red")

    if(line) {
        plot <- plot + geom_smooth(method="lm") 
    }

    ggsave(file="plot.svg", plot=plot, height=10, width=10)

    return(plot)
}

plotScatterChart(data=iris,x=iris$Petal.Length,y=iris$Petal.Width,line=TRUE)

错误

non-numeric argument to binary operator

附加

欢迎提出改进此功能的其他建议。

3 个答案:

答案 0 :(得分:26)

错误是因为+之后的geom_point()。删除它,它应该工作。

答案 1 :(得分:20)

克里斯托弗的回答是完全正确的。让我补充一点,ggplot似乎也接受名单:

plot <- ggplot(data, aes(x, y)) +
  list(
    geom_point(),
    aes(alpha=0.3,color=scale),
    scale_color_gradient(high="red"),
    NULL
  )

不幸的是,与你可以编写[1, 2, 3, ]的Python不同,构造list(1, 2, 3, )在R中产生错误。这是最终NULL的原因,ggplot2被{{ 1}}。

另一种可能的解决方法是编写

plot <- ggplot(data, aes(x, y)) +
  geom_point() +
  #aes(alpha=0.3,color=scale) +
  #scale_color_gradient(high="red") +
  list()

最终的list()应该保留到位以取消上一个+符号的效果;否则就是无操作。

答案 2 :(得分:5)

在2.0.0版本中,ggplot2获得了一个新的几何图形,geom_blank()没有任何内容。

当它被放置为最后一层时,它可以用来避免这种类型的错误。

plot <- ggplot(data, aes(x, y)) +
  geom_point() +
  #aes(alpha=0.3,color=scale) +
  #scale_color_gradient(high="red") +
  geom_blank()

以这种方式使用geom_blank()类似于@krlmlr's answer中使用list()作为最后一层的解决方法。