我正在构建一个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)})
}
}
答案 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)