当函数

时间:2015-07-17 20:53:06

标签: r ggplot2

我需要在函数内生成一个图,依赖aes_string(),我需要标签作为rownames。

下面的图表工作正常,但不在函数内

library(ggplot2)
data(mtcars)
plotfun <- function(cars) {
  g <- ggplot(data = cars, aes_string(x = "mpg", y = "disp", label = "rownames(cars)"))
  g <- g + geom_point()
  g <- g + geom_text()
  g
}
plotfun(cars = mtcars)

当作为一个函数运行时,我得到了:

Error: Aesthetics must either be length one, or the same length as the dataProblems:mpg, disp

我无法绕过它。 我知道函数中有大量similar questions关于aes_string() - 我只是无法使他们的解决方案适应我的问题。

Ps。:显然,上面的MWE非常愚蠢;在我的实际用例中,我通过for循环运行绘图,因此需要aes_string()

2 个答案:

答案 0 :(得分:4)

在deparse中使用它似乎适用于aes_string

plotfun <- function(cars) {
  g <- ggplot(data = cars, aes_string(x = "mpg", y = "disp", 
              label = deparse(rownames(cars))))
  g <- g + geom_point()
  g <- g + geom_text()
  g
}

plotfun(cars = mtcars)

enter image description here

对于其他一些信息deparse会将未评估的表达式(rownames(cars))转换为字符串,这意味着mtcars

> deparse(rownames(mtcars))
[1] "c(\"Mazda RX4\", \"Mazda RX4 Wag\", \"Datsun 710\", \"Hornet 4 Drive\", "         
[2] "\"Hornet Sportabout\", \"Valiant\", \"Duster 360\", \"Merc 240D\", \"Merc 230\", "
[3] "\"Merc 280\", \"Merc 280C\", \"Merc 450SE\", \"Merc 450SL\", \"Merc 450SLC\", "   
[4] "\"Cadillac Fleetwood\", \"Lincoln Continental\", \"Chrysler Imperial\", "         
[5] "\"Fiat 128\", \"Honda Civic\", \"Toyota Corolla\", \"Toyota Corona\", "           
[6] "\"Dodge Challenger\", \"AMC Javelin\", \"Camaro Z28\", \"Pontiac Firebird\", "    
[7] "\"Fiat X1-9\", \"Porsche 914-2\", \"Lotus Europa\", \"Ford Pantera L\", "         
[8] "\"Ferrari Dino\", \"Maserati Bora\", \"Volvo 142E\")"   

作为字符向量,可以在aes_string内轻松评估。

答案 1 :(得分:4)

我认为aes_q来自aes_string而不是library(ggplot2) data(mtcars) plotfun <- function(cars) { g <- ggplot(data = cars, aes_q(x = as.name("mpg"), y = as.name("disp"), label=rownames(cars))) g <- g + geom_point() g <- g + geom_text() g } plotfun(cars = mtcars)

会更好
aes_q

as.name()允许您传递未评估的符号和调用,因此我们只需使用models.ForeignKey('aplicationname.modelname') 将您的字符串转换为符号,以后可以在数据中进行评估。