我需要在函数内生成一个图,依赖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()
。
答案 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)
对于其他一些信息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')
将您的字符串转换为符号,以后可以在数据中进行评估。