首页 > 解决方案 > R Shiny 仅观察到特定的 reactiveVal 变化

问题描述

是否可以observe仅在特定reactiveVal更改时触发功能?

在我的全代码交叉引用模块中,带有反应和观察者,我有一些东西可以归结为以下玩具示例:

library(shiny)

shinyApp(
  fluidPage(
    textInput('i1', 'Input 1'),
    textInput('i2', 'Input 2'),
    textInput('out', 'Output (do not edit)')
  ),
  function(input, output, session) {
    observe({ print(input$i2); updateTextInput(session, 'out', value = input$i1) })
    observe({ print(input$i1); updateTextInput(session, 'out', value = input$i2) })
  }
)

请注意,如果没有 print 语句,代码将按照我希望的方式工作。但是,如果两个观察者都使用这两个输入,则两个都按顺序触发,并且仅input$i2来自第二个观察者的触发被放入我的outtextInput 中。

有什么方法可以告诉闪亮我只希望第一个observeinput$i1更改时运行,而第二个observe在更改时运行input$i2

编辑

事实证明,您可以只使用observeEvent输入来区分它们。但是,在一个现在更加复杂的示例中,我无法使用observeEventon reactiveVal- 在这种情况下,它根本不会触发。同样,下面的示例在没有 print 语句的情况下工作,但是两个观察者都会触发。

有没有办法观察 a 的变化reactiveVal

library(shiny)

shinyApp(
  fluidPage(
    textInput('i1', 'Make uppercase'),
    textInput('i2', 'Make lowercase'),
    textInput('out', 'Output (ideally not editable)')
  ),
  function(input, output, session) {
    i1 <- reactiveVal('')
    i2 <- reactiveVal('')

    observeEvent(input$i1, { i1(toupper(input$i1)) })
    observeEvent(input$i2, { i2(tolower(input$i2)) })

    observe({ print(i2()); updateTextInput(session, 'out', value = i1()) })
    observe({ print(i1()); updateTextInput(session, 'out', value = i2()) })
  }
)

标签: rshinyreactive

解决方案


observeEvent确实适用于任何反应式上下文,这是它如何使用的示例reactiveVal

library(shiny)

shinyApp(
  fluidPage(
    textInput('i1', 'Make uppercase'),
    textInput('i2', 'Make lowercase'),
    textInput('out', 'Output (ideally not editable)')
  ),
  function(input, output, session) {
    i1 <- reactiveVal('')
    i2 <- reactiveVal('')
    
    observeEvent(input$i1, { i1(toupper(input$i1)) })
    observeEvent(input$i2, { i2(tolower(input$i2)) })
    
    observeEvent(i1(), {print(i2()); updateTextInput(session, 'out', value = i1()) })
    observeEvent(i2(), {print(i1()); updateTextInput(session, 'out', value = i2()) })
  }
)

推荐阅读