我正在尝试使用ggplot2以编程方式绘制分布。
我无法弄清楚如何在这里使用非标准评估(NSE)(甚至在阅读过Hadley的NSE书籍章节之后)。
请考虑以下代码:
library(ggplot2)
gg_dens <- function(x){
eval(ggplot(data.frame(x), aes_string(x = substitute(x))) + geom_density() +
ggtitle(substitute(x)), data.frame(x))
}
lapply(mtcars, function(x) gg_dens(x))
此代码 生成许多密度图,每列一个,确定。但是,不打印正在绘制的变量的名称。而是打印占位符变量x
(参见图)。
我的目标是将x
引号替换为实际变量名称,例如mpg
。
答案 0 :(得分:1)
您可以尝试:
gg_dens <- function(x, y){
ggplot(y, aes_(x = as.name(colnames(y)[x]))) + geom_density() + ggtitle(colnames(y)[x])
}
lapply(1:ncol(mtcars), gg_dens, mtcars)
我们的想法是遍历列索引。 aes_
将字符串与as.name
一起转换为名称。
答案 1 :(得分:1)
js-mode
无法使用您现在解决此问题的功能。传递给该函数时,lapply
只是一个向量,它不是该变量的名称,x
没有传递 名称的任何内容。换句话说,在该函数的范围内没有任何东西可以找出适当的x轴标签。
一种解决方案类似于@Jimbou:
lapply
或者只是改用facet:
gg_dens <- function(name, dat) {
ggplot(dat, aes_string(x = name)) + geom_density() + ggtitle(name)
}
lapply(names(mtcars), gg_dens, mtcars)