reactiveValuesToList ведет себя не так, как ожидалось - PullRequest
1 голос
/ 03 августа 2020

Я ожидал бы, что reactiveValuesToList() вернет простой старый список, но, похоже, мне нужно запустить реактивные выражения, хранящиеся в результирующем объекте, прежде чем приступить к своим делам. Для этого есть причина? Я неправильно понимаю функцию?

В этом конкретном случае мне интересно, почему первый метод получения vals2 не работает, и я должен использовать обходной путь сразу после него. Выдает сообщение об ошибке Error in : 'match' requires vector arguments.

1 Ответ

2 голосов
/ 10 августа 2020

Проблема в том, что ваш vals является объектом reactiveValues, который содержит reactive объектов. reactiveValuesToList фактически преобразует ваш reactiveValues объект в список, который все еще содержит reactives. То есть вы должны «вызвать» их, чтобы получить их значение (например, vals[[1]]()).

На самом деле вам не нужно, чтобы vals был реактивным, если вы не хотите добавить несколько лог c для реакции ive (каламбур) добавлен новый элемент.

Замена vals <- reactiveValues() на vals <- list() будет одинаково работать (и удалит небольшие накладные расходы).

Как бы вы ни решили , в какой-то момент вам нужно l oop через reactive элементы vals и получить их значения.

Таким образом, я бы написал ваш сервер следующим образом:

server <- function(input, output, session){
   vals <- list() # can also be changed to reactiveValues()...
   # reactive code
   filterset <- eventReactive(
      {
         input$apply
      },
      {
         vals2 <- lapply( 
            # ...however the implicit transformation to a list here 
            # is better done explicitly in this case 
            # reactiveValuesToList(vals)
            vals, 
            function(x) x()
         )
         
         subsel(dataset, vals2)
      }
   )
   
   # pickers + filter values
   vals[['V1']] <- excelStyleFilterServer('V1', filterset)
   vals[['V2']] <- excelStyleFilterServer('V2', filterset)
   vals[['V3']] <- excelStyleFilterServer('V3', filterset)
   
   # table output
   output$tab <- renderTable({
      filterset()
   })
}

Бонусный ответ

Вы должны поместить свой box вместе с таблицей в fluidRow, чтобы содержимое не разлилось в поле:

fluidRow(
   box(
         title = 'Dataset',
         tableOutput('tab')
      )
)
...