【问题标题】:Update reactiveValues in shiny R with multiple triggers使用多个触发器更新闪亮 R 中的反应值
【发布时间】:2020-01-29 12:34:46
【问题描述】:

我正在尝试将 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)

【问题讨论】:

    标签: r shiny shiny-reactivity


    【解决方案1】:

    如果您仔细阅读 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 列!上述服务器示例的建议是在您的示例中运行服务器功能。

    【讨论】:

      猜你喜欢
      • 2019-06-30
      • 2022-10-31
      • 2019-01-10
      • 2020-02-08
      • 1970-01-01
      • 2017-03-10
      • 2020-05-17
      • 2018-10-09
      • 1970-01-01
      相关资源
      最近更新 更多