r - 如果 ggplot 中的语句导致 R 中的错​​误,二元运算符的非数字参数

标签 r if-statement ggplot2

我正在程序的函数内使用 ggplot 在 R 中创建图表。根据调用函数的时间,可能需要绘制某些数据,有时则不需要。我正在尝试使用 ggplot 中的 if 语句来处理这些不同的场景。

使用 mtcars 数据集并添加一个时间戳,即 3/29/2016 9:00 - 3/29/2016 11:35 递增 5 分钟,可以总结如下。

首先,没有 if 语句的工作示例:

chart <-  ggplot(mtcars, aes(x=Date_Time))+
  geom_rect(aes(ymin=drat, ymax=wt, xmin=Date_Time-80, xmax=Date_Time+80, fill=factor(sign(drat-wt))))+
  scale_fill_manual(guide="none", values=c("red", "green"))

plot (chart)

Working plot

添加下面的 if 语句会产生错误,“geom_rect(aes(ymin = drat, ymax = wt, xmin = Date_Time - 80, 中的错误): 二元运算符的非数字参数”。此外,此错误发生在调用打印命令之前。

    chart <-  ggplot(mtcars, aes(x=Date_Time))+
     if(TRUE){
      geom_rect(aes(ymin=drat, ymax=wt, xmin=Date_Time-80, xmax=Date_Time+80, fill=factor(sign(drat-wt))))+
      scale_fill_manual(guide="none", values=c("red", "green"))
     }

如果我删除“scale_fill_manual”命令并保留在 if 语句中,它就会起作用。

chart <-  ggplot(mtcars, aes(x=Date_Time))+
  if(TRUE){
    geom_rect(aes(ymin=drat, ymax=wt, xmin=Date_Time-80, xmax=Date_Time+80, fill=factor(sign(drat-wt))))
  }

plot (chart)

Working example 2

任何人都可以阐明为什么 if 语句造成如此麻烦以及如何让 ggplot 与 if 语句一起使用吗?另外,为什么删除scale_fill_manual命令有帮助?显然,就我而言,我想保留scale_fill_manual。

要生成我使用过的 mtcars 数据集,请复制并粘贴以下代码:

mtcars <- structure(list(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1, 14.3, 
24.4, 22.8, 19.2, 17.8, 16.4, 17.3, 15.2, 10.4, 10.4, 14.7, 32.4, 
30.4, 33.9, 21.5, 15.5, 15.2, 13.3, 19.2, 27.3, 26, 30.4, 15.8, 
19.7, 15, 21.4), cyl = c(6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 
8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 4, 8, 6, 8, 4), 
    disp = c(160, 160, 108, 258, 360, 225, 360, 146.7, 140.8, 
    167.6, 167.6, 275.8, 275.8, 275.8, 472, 460, 440, 78.7, 75.7, 
    71.1, 120.1, 318, 304, 350, 400, 79, 120.3, 95.1, 351, 145, 
    301, 121), hp = c(110, 110, 93, 110, 175, 105, 245, 62, 95, 
    123, 123, 180, 180, 180, 205, 215, 230, 66, 52, 65, 97, 150, 
    150, 245, 175, 66, 91, 113, 264, 175, 335, 109), drat = c(3.9, 
    3.9, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 
    3.07, 3.07, 3.07, 2.93, 3, 3.23, 4.08, 4.93, 4.22, 3.7, 2.76, 
    3.15, 3.73, 3.08, 4.08, 4.43, 3.77, 4.22, 3.62, 3.54, 4.11
    ), wt = c(2.62, 2.875, 2.32, 3.215, 3.44, 3.46, 3.57, 3.19, 
    3.15, 3.44, 3.44, 4.07, 3.73, 3.78, 5.25, 5.424, 5.345, 2.2, 
    1.615, 1.835, 2.465, 3.52, 3.435, 3.84, 3.845, 1.935, 2.14, 
    1.513, 3.17, 2.77, 3.57, 2.78), qsec = c(16.46, 17.02, 18.61, 
    19.44, 17.02, 20.22, 15.84, 20, 22.9, 18.3, 18.9, 17.4, 17.6, 
    18, 17.98, 17.82, 17.42, 19.47, 18.52, 19.9, 20.01, 16.87, 
    17.3, 15.41, 17.05, 18.9, 16.7, 16.9, 14.5, 15.5, 14.6, 18.6
    ), vs = c(0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 
    0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1), am = c(1, 
    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 
    0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1), gear = c(4, 4, 4, 3, 
    3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 
    3, 3, 4, 5, 5, 5, 5, 5, 4), carb = c(4, 4, 1, 1, 2, 1, 4, 
    2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, 1, 
    2, 2, 4, 6, 8, 2), Date_Time = structure(c(1459256400, 1459256700, 
    1459257000, 1459257300, 1459257600, 1459257900, 1459258200, 
    1459258500, 1459258800, 1459259100, 1459259400, 1459259700, 
    1459260000, 1459260300, 1459260600, 1459260900, 1459261200, 
    1459261500, 1459261800, 1459262100, 1459262400, 1459262700, 
    1459263000, 1459263300, 1459263600, 1459263900, 1459264200, 
    1459264500, 1459264800, 1459265100, 1459265400, 1459265700
    ), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("mpg", 
"cyl", "disp", "hp", "drat", "wt", "qsec", "vs", "am", "gear", 
"carb", "Date_Time"), row.names = c("Mazda RX4", "Mazda RX4 Wag", 
"Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", "Valiant", 
"Duster 360", "Merc 240D", "Merc 230", "Merc 280", "Merc 280C", 
"Merc 450SE", "Merc 450SL", "Merc 450SLC", "Cadillac Fleetwood", 
"Lincoln Continental", "Chrysler Imperial", "Fiat 128", "Honda Civic", 
"Toyota Corolla", "Toyota Corona", "Dodge Challenger", "AMC Javelin", 
"Camaro Z28", "Pontiac Firebird", "Fiat X1-9", "Porsche 914-2", 
"Lotus Europa", "Ford Pantera L", "Ferrari Dino", "Maserati Bora", 
"Volvo 142E"), class = "data.frame")

谢谢。

最佳答案

也许你不会喜欢这个答案,但我只是不会这样做。有什么问题:

chart <-  ggplot(mtcars, aes(x=Date_Time))
if(TRUE){
  chart <- chart + geom_rect(aes(ymin=drat, ymax=wt, xmin=Date_Time-80, 
                                 xmax=Date_Time+80, fill=factor(sign(drat-wt))))+
  scale_fill_manual(guide="none", values=c("red", "green"))
}

关于r - 如果 ggplot 中的语句导致 R 中的错​​误,二元运算符的非数字参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37470436/

相关文章:

r - 如何在 R 中使用 ggplot 制作散点图,其中颜色根据 y>x 或 y<x 变化?

c - 即使数组编号匹配,它仍然返回 false

javascript - 使用太多 'if' 语句是不是编程不好?

r - ggplot 根据数据框中的值重新排序堆叠条形图

r - ggplot2:带正态曲线的直方图

r - 在 R sf 的分组列上创建新几何

r - 从 data.table 列中修剪空白

python-3.x - 如果Try语句

r - 带有字符 xintercept 的 geom_vline

r - 用准引用命名新列时可以使用函数吗?