我认为我的Shiny应用程序中缺少与反应性有关的某些内容。这是MRE,显示我的打印问题y。
library(shiny)
ui <- fluidPage(
titlePanel("Test"),
textAreaInput("text", "Text", "", width = "400px"),
verbatimTextOutput("text"),
actionButton("do", "Run"),
textOutput("result")
)
server <- function(input, output) {
observeEvent(input$do, {
y <- reactive({
x <- ""
t <- 1
while (t < 5) {
x <- paste(input$text, x, sep=",")
t <- t + 1
}
})
})
output$result <- renderPrint({y})
}
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)
您不应该在observeEventor observe调用中放入反应性值。实际上,Joe Cheng曾建议不要将任何一个observe或reactive函数嵌套在自己或另一个中。它们是用于不同目的的独立事物。由于您希望y基于input$do单击的时间来创建反应式,因此应使用eventReactive:
server <- function(input, output) {
y <- eventReactive(input$do, {
x <- ""
t <- 1
while (t < 5) {
x <- paste(input$text, x, sep=",")
t <- t + 1
}
return(x)
})
output$result <- renderText({y()})
}
Run Code Online (Sandbox Code Playgroud)
我更改renderPrint()为renderText(),以显示所需的输出。另外,由于y是响应式的,因此需要y()在renderText()调用中添加它。我还添加return(x)了eventReactive呼叫,否则t将返回值。