在循环中使用 "eval"

Using "eval" within a loop

我想动态地将绘图分配给变量名,然后在循环中调用该变量。虽然在循环外使用 "eval" 似乎工作得很好,但将其放在循环内会阻止它按预期工作。

#Sample data frame
x<-c(1,2,3,4,5)
y<-c(5,4,3,2,1)
y2<-c(1,2,3,4,5)


DF<-data.frame(x,y,y2)


#Using ggplot for p and p2
p<-ggplot(DF, aes(x=x, y=y))+
            geom_point()
p2<-ggplot(DF, aes(x=x, y=y2))+
  geom_point()

#Assign p and p2 to string "Plot1" and "Plot2"
assign(paste0("Plot",1), p )
assign(paste0("Plot",2), p2 )


#Create a list to hold all plot names
plotlist<-c("Plot1", "Plot2")




#Print plots to a pdf
pdf(paste0("Plot", "_Test.pdf"), height =8, width=16)

for(i in seq(1,length(plotlist))){
  plotname<-plotlist[i]
  plotter<-eval(parse(text=plotname))
  plotter
  print(plotname)

}

dev.off()

请注意,上面的方法不起作用。但是,如果我要 运行 在循环外使用相同的 eval 语句,又名:

  i=1
  plotname<-plotlist[i]
  plotter<-eval(parse(text=plotname))
  plotter

情节已按预期创建。有没有办法在循环中调用 "eval" ?处于循环中会导致 eval 语句的工作方式不同吗?

请注意,通过删除 for 循环,它会按预期保存(第一个)pdf:

pdf(paste0("Plot", "_Test.pdf"), height =8, width=16)

#for(i in seq(1,length(plotlist))){
  plotname<-plotlist[i]
  plotter<-eval(parse(text=plotname))
  plotter
  print(plotname)

#}

dev.off()

避免 assign/eval 的一种更像 R 的方法是

DF <- data.frame(
  x = c(1,2,3,4,5),
  y = c(5,4,3,2,1),
  y2 = c(1,2,3,4,5))

plotlist <- list(
  Plot1 = ggplot(DF, aes(x=x, y=y)) +
    geom_point(),  
  Plot2 = ggplot(DF, aes(x=x, y=y2)) +
    geom_point()
)

pdf(paste0("Plot", "_Test.pdf"), height =8, width=16)
lapply(plotlist, print)
dev.off()

您在这里的所有地块都可以轻松存储在一个列表中,我们可以在需要时 lapply() 进行修改。

主要问题是 ggplot 对象在 print()ed 之前不会呈现。当您在控制台中工作时,默认情况下最后一个表达式的结果是 print()ed。但是当你 运行 一个循环时,默认的 print()ing 不会发生。这在上一个问题中有所描述:R: ggplot does not work if it is inside a for loop although it works outside of it