非标准评估,lapply和ggplot

时间:2016-07-08 10:33:42

标签: r ggplot2 nse

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

plot resulting from code above

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

2 个答案:

答案 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)
相关问题