如何在actionButton执行期间更新R Shiny中的textOutput?

时间:2019-04-02 22:48:06

标签: r shiny

我正在构建一个R Shiny UI(分为UI和服务器),在给定一些Shiny UI参数的情况下,它将花费大约三个小时来构建疾病临床记录的data.frame。完成后,将data.frame传递给Cox模型,结果将显示为图。

在终端上运行R时,代码将在这三个小时内打印信息,例如,它解析了多少患者/药品。

我尝试使用单独的textOutput UI功能,但是似乎无法从单击按钮时执行的函数调用中更新textOutput。我相信这可能与范围有关。我的代码按UI和服务器划分:

注意::单击该按钮一次,我希望看到一次循环调用后,该单击上的textOutput会多次更新。

library(shiny)


shinyUI(fluidPage(

  # Application title
  titlePanel("CPRD EHR Statistical Toolset"),


  sidebarLayout(
    sidebarPanel(
      helpText("A long list of Input features below here."),
      mainPanel(
        h4("Medical record construction"),
        textOutput("numPatientsOutput"),
        actionButton("executeButton", "Execute Cox")
      )
    )
  )
))

library(shiny)

shinyServer(function(input, output) {

  observeEvent(input$executeButton, {
    coxDF<-runBuildModel(input, output)
  }) #endf of execute action

})

runBuildModel <- function(input, output) {
  for(i in 1:10) {
    #This is not updating.
    output$numPatientsOutput <- renderText({paste("patient:",i)})
  }
}

1 个答案:

答案 0 :(得分:0)

server基本上在呈现代码之前先运行所有代码。这就是为什么只得到最后一行文本的原因。

您可以做的是创建一个reactiveValue并在for循环中更新此值。另外,您必须创建一个observer来跟踪值。

工作示例

library(shiny)

ui <- shinyUI(fluidPage(

  # Application title
  titlePanel("CPRD EHR Statistical Toolset"),


  sidebarLayout(
    sidebarPanel(
      helpText("A long list of Input features below here.")),
    mainPanel(
      h4("Medical record construction"),
      htmlOutput("numPatientsOutput"),
      actionButton("executeButton", "Execute Cox")
    )

  )
))

server <- shinyServer(function(input, output) {
  runBuildModel <- function(input, output) {
    for(i in 1:10) {
      #This is not updating.
      rv$outputText = paste0(rv$outputText,"patient:",i,'<br>')
    }
  }

  rv <- reactiveValues(outputText = '')

  observeEvent(input$executeButton, {
    coxDF<-runBuildModel(input, output)
  }) #endf of execute action

  observe(output$numPatientsOutput <- renderText(HTML(rv$outputText)))
})



shinyApp(ui, server)