我想动态地将图分配给变量名,然后在循环内调用该变量。尽管在循环外部使用“ eval”似乎可以正常工作,但将其放在循环中会阻止其按预期工作。
public static void getDataTest(String url) throws IOException
{
String html = Jsoup.connect(url).execute().body();
html = html.replaceAll("<!--", "");
html = html.replaceAll("-->", "");
Document doc = Jsoup.parse(html);
Element tableElements = doc.getElementById("table#fg3a_per_g");
System.out.print("Element found was: " + tableElements);
}
请注意,以上操作无效。但是,如果我要在循环外运行相同的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”?而处于循环状态会导致eval语句以不同的方式工作?
注意,通过删除for循环,可以按预期方式保存(第一个)pdf:
i=1
plotname<-plotlist[i]
plotter<-eval(parse(text=plotname))
plotter
答案 0 :(得分:2)
一种更像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()
处理后才能呈现。在控制台中工作时,默认情况下,最后一个表达式的结果为print()
。但是,当您运行循环时,默认的print()
不会发生。先前的问题对此进行了描述:R: ggplot does not work if it is inside a for loop although it works outside of it