二元运算符的非数字参数

Jef*_*pia 25 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)
Run Code Online (Sandbox Code Playgroud)

错误

non-numeric argument to binary operator
Run Code Online (Sandbox Code Playgroud)

额外

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

Chr*_*den 27

这个错误是因为尾部的+geom_point().删除它,它应该工作.


krl*_*mlr 20

克里斯托弗的回答是完全正确的.让我补充说,ggplot似乎也接受列表:

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

不幸的是,与你可以编写的Python不同[1, 2, 3, ],这个结构list(1, 2, 3, )在R中产生了一个错误.这就是结果的原因NULL,我很高兴被忽略了ggplot2.

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

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

决赛list()应该留在原地以取消最后一个+星座的影响; 否则就是无操作.


Uwe*_*Uwe 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()
Run Code Online (Sandbox Code Playgroud)

使用geom_blank()这种方式类似于变通办法@ krlmlr的答案,它使用list()的最后一层.