How to update DT datatable in Shiny when within a module and the selection criteria are changed

孤者浪人 提交于 2019-12-13 03:45:46

问题


I try to make a shiny module to present data from dataframes using the DT package. I would like to use a module to have a standard set up of DT-table options like language and others.

I want the user to be able to select different subsets of the data interactively and thereafter be able to see the data as a DT-table. The selection of the subset will be generated outside the module because I would like the subset to be available for other uses, for example to be exported to a csv-file.

This works as intended when I don't use a module for making the DT table. When I put the code inside a module, a table is produced when the app starts. But when the selection criteria are changed, the table don't update.

I have included an app illustrating the problem. Table 1 is generated without using shiny module and updates as expected when the selection changes. Table 2 is output using the module and don't update when the selection is changed.

I'm running R-studio 1.1.463, R version 3.5.2 and DT version 0.5.

require("DT")
require("shiny")

# module for presenting data using DT
showDTdataUI <- function(id) { 
  ns <- NS(id)
  tagList(
    DT::dataTableOutput(ns("table"))
  )
  }

showDTdata <- function(input, output, session, DTdata) {
  output$table <- renderDataTable({
      DT::datatable(DTdata)
    })
}

# User interface
ui <- 
  fluidPage(
    sidebarLayout(
      sidebarPanel(id="DT",
                   width = 4,
                   helpText(h4("Select")),
                   selectInput("selectedSpecies", label = "Species",
                               choices = c("setosa","versicolor","virginica"), 
                               selected = "versicolor")
      ),
      mainPanel(
        h3("Table 1. Presenting selected data from Iris" ),
        DT::dataTableOutput("table"),
        h5(br("")),
        h3("Table 2. Presenting selected data from Iris using shiny module"),
        showDTdataUI(id="testDTModule")
      )
    )
  )


# Define server logic ----
server <- function(session, input, output) {

  selectedIris <- reactive ( {
    selected <- iris[which(iris$Species==input$selectedSpecies),]
    selected
  })

  output$table <- renderDataTable({
    DT::datatable(selectedIris())
  })

  callModule(showDTdata, id="testDTModule", DTdata=selectedIris())

}

# Run the app ----
shinyApp(ui = ui, server = server)

回答1:


You have to pass the reactive conductor in showDTdata:

showDTdata <- function(input, output, session, DTdata) {
  output$table <- renderDataTable({
    DT::datatable(DTdata()) # not datatable(DTdata)
  })
}

callModule(showDTdata, id="testDTModule", DTdata=selectedIris) # not DTdata=selectedIris()



回答2:


Without knowing of the shiny module approach, I would have probably written it like a normal function. The app below works but I am curious now after seeing the answer by @Stephane what the advantages are of using callModule approach over regular function approach

require("DT")
require("shiny")


makeTable <- function(dataframe) { DT::datatable(dataframe) %>% 
                                   formatStyle(names(dataframe), background = '#fff') 
                                  }

# User interface
ui <- 
  fluidPage(
    sidebarLayout(
      sidebarPanel(id="DT",
                   width = 4,
                   helpText(h4("Select")),
                   selectInput("selectedSpecies", label = "Species",
                               choices = c("setosa","versicolor","virginica"), 
                               selected = "versicolor")
      ),
      mainPanel(
dataTableOutput('Table1')
      )
    )
  )


# Define server logic ----
server <- function(session, input, output) {

  selectedIris <- reactive ( {
    selected <- iris[which(iris$Species==input$selectedSpecies),]
    selected
  })

 output$Table1 <- renderDataTable(makeTable(selectedIris()))
}

# Run the app ----
shinyApp(ui = ui, server = server)


来源:https://stackoverflow.com/questions/55329237/how-to-update-dt-datatable-in-shiny-when-within-a-module-and-the-selection-crite

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!