Использование «eval» в цикле - PullRequest
0 голосов
/ 19 марта 2019

Я хотел бы динамически назначить график имени переменной, а затем вызвать эту переменную последним в цикле. Хотя использование «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 вне цикла, AKA:

  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()

1 Ответ

2 голосов
/ 20 марта 2019

Более R-подобный способ сделать это, избегая assign / eval, будет

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() по умолчанию не происходит.Это описано в предыдущем вопросе: R: ggplot не работает, если он находится внутри цикла for, хотя он работает вне его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...