在循环中使用 "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
我想动态地将绘图分配给变量名,然后在循环中调用该变量。虽然在循环外使用 "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