使用多个触发器更新 shiny R 中的 reactiveValues

Update reactiveValues in shiny R with multiple triggers

我正在尝试将 esquisse 集成到应用程序中。目前我有一个允许用户过滤一些数据的应用程序,我想将该数据传递给 esquisse。 Esquisse 将 reactiveValues 作为输入,通常使用 observeEvent 进行更新。但是,我不确定如何在此处使用 observeEvent,因为当许多不同的过滤器发生变化时数据会更新。有没有办法在每次数据更改时更新值?

示例应用:

library(shiny)
library(esquisse)

ui <- fluidPage(

  titlePanel("Use esquisse as a Shiny module"),
    mainPanel(
      tabsetPanel(
        tabPanel(
          mainPanel(
            selectInput(
              inputId = "am", 
              label = "am:", 
              choices = c(0,1)
            ),
            selectInput(
              inputId = "gear", 
              label = "gear:", 
              choices = c(3,4,5)
            ),
            selectInput(
              inputId = "carb", 
              label = "carb:", 
              choices = c(1,2,3,4,6,8)
            )
          )),
          tabPanel(
          title = "esquisse",
          esquisserUI(
            id = "esquisse", 
            header = FALSE, # dont display gadget title
            choose_data = FALSE # dont display button to change data
          )
        )
      )
  )
)


server <- function(input, output, session) {
  data_r <- reactiveValues(data = data.frame(), name = "empty")

  data <- reactive({
    mtcars %>%
      filter(am == input$am,
             gear == input$gear,
             carb == input$carb
             )
  })

  data_r$data <- reactive({data()}) ### this doesn't work, so need something similar to this

  callModule(
    module = esquisserServer,
    id = "esquisse",
    data = data_r)
}

shinyApp(ui, server)

如果您仔细阅读 here 中的示例(我假设您已经阅读了),您可能会发现没有使用 reactive(...) 部分。要修复您的服务器部分,请使用(如示例中所示)reactiveValueobserveEvent 的组合。

使用reactiveValue,初始化一个名为data_r的默认变量。要更新变量,observeEvent 观察输入参数 amgearcarb 并在输入参数之一发生变化时更改 data_r

您的服务器函数可能如下所示:

server <- function(input, output, session) {
  # initialize data_r
  data_r <- reactiveValues(data = data.frame(), name = "empty")

  # reactive filter for data_r on events am, gear and carb
  observeEvent(
    {input$am
     input$gear
     input$carb
     1}, # last object not NULL needed here!
    {am_filter <- input$am
     gear_filter <-  input$gear
     carb_filter <- input$carb

     data_r$data <- iris %>% 
       filter(Sepal.Length == am_filter, 
              Sepal.Width == gear_filter, 
              Petal.Length == carb_filter)}
  )

  callModule(module = esquisserServer, id = "esquisse", data = data_r)
}

提到 iris 数据集没有列 amgearcarb!上述服务器示例的提议,是运行您示例中的服务器功能。