闪亮的条件隔离/检查值是否改变
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))
})
问题出在这里:我有一个反应性输入返回一个字符串。字符串的一部分描述类别,一部分描述项目。有些事件我希望仅在类别更改时触发,而不是在项目更改时触发。换句话说,我希望有条件地隔离一个事件,以便根据该事件的实际值调用反应函数。
这里有一个演示:
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))
})