我正在尝试将图表分配给通过变量命名的列表( snm )。我的代码片段是我尝试做的所有变体,以使其工作。我错过了什么其他选择?感谢。
我的目标是循环我的图表分配,使用IF语句更改 snm 以及我将在图表中使用的一些其他变量。
for (x in seq(0,1)) {
if (x==0) {
snm="grad"
}
else if (x==1) {
snm="start"
}
assign(snm,list(),envir=.GlobalEnv) #works
assign(snm[[1]],ggplot(data=TDSF, aes(x=Graduation))+geom_histogram()+labs(title="A"),envir=.GlobalEnv) #works
assign(snm[[2]],ggplot(data=TDSF, aes(x=Graduation,weights=Donation))+geom_bar()+labs(title="B"),envir=.GlobalEnv) #fails "subscript out of bonds"
assign(snm[[3]],ggplot(data=TDSF, aes(x=State,weights=Donation))+geom_bar()+labs(title="B")+scale_y_sqrt(),envir=.GlobalEnv) #fails "subscript out of bonds"
grid.arrange(grad[[1]],grad[[2]],grad[[3]])
}
部分解决方案基于@MrFlick和@hrbrmstr,但是1)我必须在循环中使用do.call或者我得到相同的图形和2)看到mapply我觉得我应该能够使用它,但不能让它发挥作用。
library(ggplot2)
library(gridExtra)
set.seed(1492)
TDSF <- data.frame(Graduation=sample(1950:2010, 30),
Donation=sample(300:10000, 30),
Start.Year=sample(1950:2010,30),
State=sample(state.abb,30,replace=TRUE))
plots <- list()
for (x in seq(0,1)) {
if (x==0) {
nm=quote(Graduation)
snm="grad"
}
else if (x==1) {
nm=quote(Start.Year)
snm="start"
}
plots[[snm]]<-list()
plots[[snm]][[1]] <- ggplot(data=TDSF, aes(x=eval(nm)))+geom_histogram()+labs(title=paste("Number of People per",snm,"Year"))
plots[[snm]][[2]] <- ggplot(data=TDSF, aes(x=eval(nm),weights=Donation))+geom_bar()+labs(title=paste("Donations by",snm,"Year"))
plots[[snm]][[3]] <- ggplot(data=TDSF, aes(x=State,weights=Donation))+geom_bar()+labs(title="Donations by State")+scale_y_sqrt()
}
do.call(grid.arrange,plots[["grad"]])
do.call(grid.arrange,plots[["start"]])
mapply attempt:
plot<-mapply(function(snm,nm) list(
{ggplot(data=TDSF, aes(x=nm))+geom_histogram()+labs(title=paste("Number of People per",snm,"Year"))},
{ggplot(data=TDSF, aes(x=nm,weights=Donation))+geom_bar()+labs(title=paste("Donations by",snm,"Year"))},
{ggplot(data=TDSF, aes(x=State,weights=Donation))+geom_bar()+labs(title="Donations by State")+scale_y_sqrt()}
), c("grad","start"),c("Graduation","Start.Year"),SIMPLIFY = FALSE)
do.call(grid.arrange,plot[["grad"]])
do.call(grid.arrange,plot[["start"]])
答案 0 :(得分:1)
尽管代码片段冗长,但您的问题确实不明确。你想做这样的事吗?
library(ggplot2)
library(gridExtra)
set.seed(1492)
TDSF <- data.frame(Graduation=sample(1950:2010, 30),
Donation=sample(300:10000, 30))
snm <- mapply(function(x, title) {
ggplot(TDSF, aes_(x=as.name(x))) +
geom_histogram() +
labs(title=title)
}, c("Graduation", "Donation"), c("A", "B"), SIMPLIFY=FALSE)
do.call(grid.arrange, snm)
答案 1 :(得分:0)
我原本想做的事情是不可能的。但是,根据反馈,我能够创建一个ggplots列表列表。这将我的结果浓缩为1变量,而不是我定位的2变量。我使用revrev=foldl(flip((:).reverse))[]
代替start[[1]]
绘制第一个图表。你读它时有道理,但不是我的预期。我来自VBA和python所以R是新格式。
Mapply也是比我原来做的更强大/更简单的方法,所以感谢你的投入。
plot[["start"]][[1]]