R - 将图分配给可变命名列表

时间:2016-08-20 02:24:22

标签: r assign

我正在尝试将图表分配给通过变量命名的列表( 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"]])

2 个答案:

答案 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]]