В приложении R Shiny я пытаюсь использовать DT::replaceData для обновления данных, чтобы они отображались с сохранением текущего состояния (например, фильтрации). Хотя он работает с простым блестящим приложением, этого не происходит, когда я делаю приложение модульным и вызываю его из callModule.

В приведенном ниже примере выбор вида в верхнем поле должен запускать замену данных, показанных ниже.

Вот рабочий пример:

library(shiny)

ui <- fluidPage(
  selectInput('species', 'Choose Species',
              choices=unique(iris$Species),
              selected=unique(iris$Species), multiple=TRUE),
  DT::dataTableOutput('dt')
)

server <- function(input, output, session) {
  output$dt <- DT::renderDataTable({
    DT::datatable(
      iris, filter='top',
      options = list(autoWidth=TRUE)
    )
  })

  observeEvent(is.null(input$species), {
    DT::replaceData(
      DT::dataTableProxy('dt'),
      dplyr::filter(iris, Species %in% input$species)
    )
  })
}

shinyApp(ui, server)

И это модульная версия, которая не работает:

library(shiny)

ui <- function(id) {
  ns <- NS(id)
  tagList(
    selectInput(ns('species'), 'Choose Species',
                choices=unique(iris$Species),
                selected=unique(iris$Species), multiple=TRUE),
    DT::dataTableOutput(ns('dt'))
  )
}

server <- function(input, output, session) {
  output$dt <- DT::renderDataTable({
    DT::datatable(
      iris, filter='top',
      options = list(autoWidth=TRUE)
    )
  })

  observeEvent(is.null(input$species), {
    print(input$species)
    DT::replaceData(
      DT::dataTableProxy('dt'),
      dplyr::filter(iris, Species %in% input$species)
    )
  })
}


mainUi <- fluidPage(ui('app'))
mainSrv <- function(input, output, session) {
  callModule(server, 'app')
}
shinyApp(mainUi, mainSrv)

Хотелось бы узнать, почему второй пример не работает, и как это исправить, если это возможно.


Обновить

Решено!

Это исправлено, начиная с DT v0.3. См .: https://github.com/rstudio/DT/issues/357

0
Kota Mori 1 Мар 2018 в 20:22

1 ответ

Лучший ответ

Решено с версии 3.0. Ссылка: https://github.com/rstudio/DT/issues/357

Итак, просто решается:

install.packages('DT')
packageVersion('DT')
# [1] ‘0.4’
0
Kota Mori 2 Мар 2018 в 15:45