【问题标题】:Shiny - reactive not evaluating directly on textarea change?闪亮 - 反应不直接评估 textarea 变化?
【发布时间】: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,这似乎运作良好。为什么我不应该这样使用它?

标签: r shiny reactive


【解决方案1】:

试试这个

library(shiny)

ui <- fluidPage(
  textAreaInput("txt", "Parse this data:"),
  actionButton("go", "Do something with data"),
  textOutput("out")
)

server <- function(input, output, session) {
  rv <- reactiveVal()
  data <- reactive({
    message("Parsing data...")
    toupper(input$txt)
  })
  
  observeEvent(input$go, {
    rv(data())
  })
  output$out <- renderText({rv()})
}

shinyApp(ui, server)

【讨论】:

  • 谢谢,现在它只在单击按钮时显示图形(即在此示例中为文本)。但是,它仍然只在按下按钮时解析文本(在本例中为 toupper())。我希望在 textarea 中的输入发生更改时立即进行解析,但仅在按下按钮时显示结果。
猜你喜欢
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
相关资源
最近更新 更多