Обновите реактивные значения в блестящем R с несколькими триггерами - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь интегрировать esquisse в приложение. На данный момент у меня есть приложение, которое позволяет пользователям фильтровать некоторые данные, и я хотел бы передать эти данные в esquisse. Esquisse принимает в качестве входных данных реактивные значения, которые обычно обновляются с помощью наблюдаемого события. Тем не менее, я не уверен, как использовать наблюдение здесь как обновления данных, когда есть изменения в большом количестве различных фильтров. Есть ли способ обновлять значения при каждом изменении данных?

Пример приложения:

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)

1 Ответ

0 голосов
/ 29 января 2020

Если вы внимательно прочитаете пример из здесь (что, я полагаю, вы сделали), вы, вероятно, увидите, что никакие reactive(...) детали не используются. Чтобы исправить вашу серверную часть, используйте (как в примере) комбинацию reactiveValue и observeEvent.

reactiveValue используется для инициализации переменной по умолчанию, называемой data_r. Чтобы обновить переменную, observeEvent наблюдает за входными параметрами am, gear или carb и изменяет 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 не было столбцов am, gear или carb! В приведенном выше примере сервера предлагается запустить функцию сервера в вашем примере.

...