【发布时间】:2021-03-01 17:49:04
【问题描述】:
我正在创建一个 Shiny 应用程序,在该应用程序中解析用户输入,然后用于创建特定的绘图。这些图只应在用户按下相应按钮时创建。然而,当用户输入发生变化时,应该立即解析文本。
简化示例:
library(shiny)
ui <- fluidPage(
textAreaInput("txt", "Parse this data:"),
actionButton("go", "Do something with data"),
textOutput("out")
)
server <- function(input, output, session) {
data <- reactive({
message("Parsing data...")
toupper(input$txt)
})
observeEvent(input$go, {
output$out <- data
})
}
shinyApp(ui, server)
“正在解析数据...”消息最初仅在按下按钮时执行,而不是在更改 textAreaInput 的输入时执行。
最重要的是,按下按钮一次后,输入会在更改时立即解析,但输出也会立即更新。这也不应该发生,它只会在再次按下按钮时发生变化。
编辑
通过 YBS 的回答,我找到了解决方案,并且使用 isolate() 我什至不需要额外的变量:
server <- function(input, output, session) {
data <- reactiveVal()
observeEvent(input$txt, {
message("Parsing data...")
data(toupper(input$txt))
})
observeEvent(input$go, {
output$out <- renderText({ isolate( data() ) })
})
}
【问题讨论】:
-
反应对象是
data(),需要一个renderText。 -
...并且不要在观察者中定义您的
output$out对象。 -
我的解决方案现在在观察者内部使用 output$out,这似乎运作良好。为什么我不应该这样使用它?