现在参考下面的代码,只有在为所有列返回results
时才会更新所有verbatimTextOutput框。
我希望UI在每列返回results
时显示输出,以指示应用程序确实正在取得进展。
我怎么能这样做?
INPUT_COL = c("V1","V2","V3")
shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
uiOutput("controls")
),
mainPanel(
lapply(INPUT_COL, function(self){
verbatimTextOutput(outputId=paste0("vb.",self))
})
)
)
))
shinyServer(function(input, output,session) {
output$controls<- renderUI({
lapply(INPUT_COL, function(self) {
output[[self]] <- renderUI(...)
uiOutput(self)
})
})
observe({
params <- sapply(INPUT_COL, function(self) input[[self]])
lapply(INPUT_COL, function(self) {
output[[paste0("vb.",self)]] <- renderPrint(
{ tryCatch(
{
results<- getResults(params) #some long process
print(results)
},
warning=function(war) return(war),
error=function(err) return(err)
)
})
})
})
}
答案 0 :(得分:0)
使用计数器
计算出来status <-reactiveValues(i=0)
shinyServer(function(input, output,session) {
output$controls<- renderUI({
lapply(INPUT_COL, function(self) {
output[[self]] <- renderUI(...)
uiOutput(self)
})
})
observe({
params <- sapply(INPUT_COL, function(self) input[[self]])
isolate({
if (length(params) > 0){
status$i <- status$i+1
self <- INPUT_COL[status$i]
output[[paste0("vb.",self)]] <- renderPrint(
{ tryCatch(
{
results<- getResults(params) #some long process
print(results)
},
warning=function(war) return(war),
error=function(err) return(err)
)
})
}
})
if (isolate(status$i) < length(params)){
invalidateLater(0, session) #reset the observer, so it'll repeat
}
else{
isolate({status$i <- 0})
}
})
}