我在R中使用shiny
并希望在server.R中使用observeEvent
时多次呈现
我不明白为什么这不起作用:
library(shiny)
my_UI <- fluidPage(
fluidRow(actionButton("test", "test")),
fluidRow(textOutput("out"))
)
my_Server <- function(input, output) {
observeEvent(input$test, {
output$out <- renderText("waiting")
Sys.sleep(2)
output$out <- renderText("done")
})
}
shinyApp(my_UI, my_Server)
我也尝试过:
library(shiny)
my_UI <- fluidPage(
fluidRow(actionButton("test", "test")),
fluidRow(textOutput("out"))
)
my_Server <- function(input, output) {
observeEvent(input$test, {
output$out <- renderText("waiting")
})
observeEvent(input$test, {
Sys.sleep(2)
output$out <- renderText("done")
})
}
shinyApp(my_UI, my_Server)
在这两种情况下,只渲染后一条消息...... 我在这做错了什么?谢谢!
答案 0 :(得分:2)
我无法在一个observeEvent中为每个线渲染提供解决方案,但如果您只想显示加载/计算进度,则可以使用
withProgress()
所以app可以是这样的:
library(shiny)
my_UI <- fluidPage(
fluidRow(actionButton("test", "test")),
fluidRow(textOutput("out"))
)
my_Server <- function(input, output) {
observeEvent(input$test, {
withProgress(
message = 'Calculation in progress',
detail = 'This may take a while...', value = 0, {
incProgress(1/2, message = "Step 1")
Sys.sleep(2)
# Do some stuff, load, calculate, etc
incProgress(1/2, message = "Step 2")
})
})
}
shinyApp(my_UI, my_Server)
答案 1 :(得分:1)
你不能用Shiny做到这一点,因为只会使用最新的输出值。
您可以使用javascript进行操作,但您可能有更好的选择,例如提及feniw_fx的withProgress
library(shiny)
my_UI <- fluidPage(
tags$head(
tags$script(
"function test() {
document.getElementById('out').innerHTML = 'waiting';
setTimeout(function() {document.getElementById('out').innerHTML = 'done'}, 2000);}"
)),
fluidRow(actionButton("test", "test", onclick = "test()")),
fluidRow(textOutput("out"))
)
my_Server <- function(input, output, session) {
}
shinyApp(my_UI, my_Server)