非标准评估,lapply和ggplot

我正在尝试使用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(参见图).

《非标准评估,lapply和ggplot》

我的目标是将x引号替换为实际变量名,例如mpg.

最佳答案 lapply无法使用您现在解决此问题的功能. x只是传递给该函数的向量,它不是该变量的名称,而lapply不传递任何名称.换句话说,在该函数的范围内没有任何东西可以找出适当的x轴标签.

一种解决方案类似于@Jimbou:

gg_dens <- function(name, dat) {
  ggplot(dat, aes_string(x = name)) + geom_density() + ggtitle(name)
}    
lapply(names(mtcars), gg_dens, mtcars)

或者只使用facets:

mtcars2 <- tidyr::gather(mtcars)
ggplot(mtcars2, aes(value)) + geom_density() + facet_wrap(~key, scales = 'free')
点赞