我正在尝试使用ggplot2以编程方式绘制分布。
我无法在这里弄清楚如何使用非标准评估(NSE)(即使在阅读了有关NSE的Hadley的书等章节之后)。
考虑以下代码:
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
引号。 最佳答案
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)
或者只是改用构面:
mtcars2 <- tidyr::gather(mtcars)
ggplot(mtcars2, aes(value)) + geom_density() + facet_wrap(~key, scales = 'free')
关于r - 非标准评估,lapply和ggplot,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38264528/