【发布时间】:2018-09-29 07:06:31
【问题描述】:
我有一个闪亮的应用程序,它调用一个在每次迭代中迭代生成一个图形的脚本。我需要显示每个图并尝试使用 recordPlot 将每个图保存到列表中并单独调用每个元素,但应用程序稍后无法识别这些对象。然后我还尝试在 IF 语句中包含不同的输出,但我的算法只为所有输出生成最后一个图,就像 IF 语句被忽略了,我不知道如何处理它。这是我的代码的简化:
library(shiny)
ui <- fluidPage(
# Main panel for displaying outputs ----
mainPanel(
actionButton("exec", "Start!!"),
tagList(tags$h4("First iteration:")),
plotOutput('PlotIter1'),
tags$hr(),
tagList(tags$h4("Second iteration:")),
plotOutput('PlotIter2'),
tags$hr(),
tagList(tags$h4("Third iteration:")),
plotOutput('PlotIter3'),
tags$hr())
)
server <- function(input, output) {
ii <- 1
observeEvent(input$exec,{
continue <- TRUE
while(continue==TRUE){
if(ii == 1){
output$PlotIter1<-renderPlot({
plot(rep(ii,50),main=ii)
})
}
if(ii == 2){
output$PlotIter2<-renderPlot({
plot(rep(ii,50),main=ii)
})
}
if(ii == 3){
output$PlotIter3<-renderPlot({
plot(rep(ii,50),main=ii)
})
}
ii <- ii+1
if(ii == 4){continue <- FALSE}
}
})
}
shinyApp(ui, server)
编辑:
通过使用 r2evans 和 Gregor de Cillia 提供的 local() 方法,问题得到了部分解决,但是将 server() 更改为更接近我的,(将 IF 语句替换为其他策略 FAPP 等效项)包括一些在每个绘图之间进行计算,问题仍然存在,并且最后一个数据被绘制在所有三个绘图中。
server <- function(input, output) {
y=rnorm(10,20,2)
for (i in 1:3) {
local({
thisi <- i
plotname <- sprintf("PlotIter%d", thisi)
output[[plotname]] <<- renderPlot({
plot(y, main=paste0("iteration: ",thisi,", mean: ",mean(y)
))
abline(h=mean(y),col=thisi)
})
})
y=y+100
}
}
【问题讨论】:
标签: r if-statement while-loop shiny output