【发布时间】:2021-01-11 04:01:26
【问题描述】:
我将数据框作为输入,并在其中添加了一些额外的列。然后我使用 for 循环对每一行进行处理。此处理需要时间,因此我想将处理后的行显示为单独的 ui 元素。
例如, 如果正在处理第一行,则
ROW-1
如果正在处理第 2 行,则将其添加到下一个 ROW-1
ROW-1
ROW-2
所以当我的 for 循环在行中进行时,最新处理的行将作为 UI 元素添加到列表中。
我使用了 lapply,但它会处理所有行,然后将所有内容一起显示。
library(shiny)
ui <- fluidPage(
uiOutput("ui1")
)
server <- function(input, output) {
Init_vals <- 1:5
for(i in 1:5){
Sys.sleep(5)
output[[paste("ui",i,sep="")]] = renderUI({
list(
fluidPage(
fluidRow(
textInput(
inputId=paste0("id",i) ,
label = "here",
value = Init_vals[i]
)
)
),
uiOutput(paste("ui",i + 1,sep=""))
)
})
}
}
shinyApp(ui = ui, server = server)
在这里,你可以看到只生成了最后一个ui元素,其他从ui1到ui4的元素都被跳过了!应用应每 5 秒生成新的文本输入。
【问题讨论】:
-
你应该使用
lapply,见shiny.rstudio.com/gallery/creating-a-ui-from-a-loop.html的例子
标签: r shiny shiny-server shinyapps shiny-reactivity