闪亮的条件隔离/检查值是否改变

Conditional isolate in shiny / check whether value changed

问题出在这里:我有一个反应性输入返回一个字符串。字符串的一部分描述类别,一部分描述项目。有些事件我希望仅在类别更改时触发,而不是在项目更改时触发。换句话说,我希望有条件地隔离一个事件,以便根据该事件的实际值调用反应函数。

这里有一个演示:

library(shiny)

ui <- fluidPage(
         fluidRow(
                  selectInput("selection", "Select:", 
                              choices=c("catA:itemA", "catA:itemB", "catB:itemC"))),
         fluidRow("Category:", textOutput("category")),
         fluidRow("Item:",     textOutput("item"))

      )

server <- function(input, output) {

  .cat  <- reactive({ gsub(":.*", "", input$selection) })
  .item <- reactive({ gsub(".*:", "", input$selection) })

  output$category <- renderText({
    ## this should not be triggered when category does not change!
    message("Triggered category change")
    .cat()
  })

  output$item <- renderText({
    message("Triggered item change")
    .item()
  })
}

shinyApp(ui, server)

上面的代码没有完成我想要它做的事情。我想要的是 output$category <- renderText({...}) 当且仅当 .cat() 的值发生变化时才触发 。我怎样才能实现这个微不足道的目标?

使用无功值代替无功导体:

  .cat <- reactiveVal()
  .item <- reactiveVal()
  
  observeEvent(input[["selection"]], { 
    .cat(gsub(":.*", "", input$selection))
    .item(gsub(".*:", "", input$selection))
  })