在循环中使用“ eval”

时间:2019-03-19 20:28:39

标签: r for-loop eval assign

我想动态地将图分配给变量名,然后在循环内调用该变量。尽管在循环外部使用“ 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

1 个答案:

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