非标准评估,lapply,和 ggplot
Non standard evaluation, lapply, and 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
(参见图)。
我的目标是用真正的变量名代替 x
引号,例如 mpg
.
你可以试试:
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
一起转换为名称。
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')
我正在尝试使用 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
.
你可以试试:
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
一起转换为名称。
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')