在闪亮的 DT 数据表中更改数据集时保留选定的行

keep selected rows when changing dataset in shiny DT datatable

我正在使用 DT 包在我的 shiny 应用程序中显示数据 table。因为我提供了不同的数据集,所以我有单选按钮 select 它们并且数据 table 会自动更新。

我想做的是在切换数据集时预先select 来自df1df2 的可用行。目前,我的 selection 总是被擦除。当我尝试保存 selected 行(取消注释这两行)时,我的 table 直接重置。

library(shiny)
library(DT)

df1 <- data.frame(names=letters,
                  values=1:26)
df2 <- data.frame(names=letters,
                  values=(1:26)*2)[seq(1,26,2),]

ui <- shinyUI(
  fluidPage(
    sidebarLayout(
      sidebarPanel(
        radioButtons("dataset", label=h5("Select dataset"),
                     choices=list("df1"='df1',
                                  "df2"='df2'),
                     selected='df1', inline=TRUE)
      ),
      mainPanel(
        DT::dataTableOutput("name_table")
      )
    )
  )
)

服务器端...

server <- function(input, output, session) {
  getDataset <- reactive({
    result <- list()
    result[['dataset']] <- switch(input$dataset,
                     'df1'=df1,
                     'df2'=df2)
    # result[['selection']] <- 
    #   as.numeric(input$name_table_rows_selected)
    return(result)
  })
  output$name_table <- DT::renderDataTable({
    DT::datatable(getDataset()[['dataset']],
                  options=list(pageLength=5))

  })
  name_proxy = DT::dataTableProxy('name_table')
}

shinyApp(ui, server)

我使用了 DT table,因为我需要代理和一些与数据的交互 table。

嗯,看来我找到了解决办法,但我想知道是否有更好的解决办法。

server <- function(input, output, session) {
  getDataset <- reactive({
    result <- list()
    result[['dataset']] <- switch(input$dataset,
                     'df1'=df1,
                     'df2'=df2)
    result[['selection']] <- testing()
    return(result)
  })
  testing <- function() {
    list(selected=as.numeric(input$name_table_rows_selected))
  } 
  output$name_table <- DT::renderDataTable({
    DT::datatable(getDataset()[['dataset']],
                  options=list(pageLength=5),
                  selection=getDataset()[['selection']])

  })
  name_proxy = DT::dataTableProxy('name_table')
}

我想知道,有时会收到 processing 消息。并且每次点击 table 不久 "blinks"... 如果能得到更好的答案就太好了。

只有在更改 df 时才可以保存选定的行

server <- function(input, output, session) {
  dd=reactiveValues(select=NULL)

  observeEvent(input$dataset,{
    dd$select=as.numeric(isolate(input$name_table_rows_selected))
   })

  getDataset <- reactive({
    result <- list()
    result[['dataset']] <- switch(input$dataset,
                                  'df1'=df1,
                                  'df2'=df2)

    return(result)
  })
  output$name_table <- DT::renderDataTable({
    DT::datatable(getDataset()[['dataset']],
                  options=list(pageLength=5),
                  selection = list(mode = 'multiple', selected =dd$select  )
    )

  })
  name_proxy = DT::dataTableProxy('name_table')
}

shinyApp(ui, server)

或对@drmariod 变体进行一些修改:使用eventReactive 而不是reactive

server <- function(input, output, session) {
  getDataset <- eventReactive(input$dataset,{
    result <- list()
    result[['dataset']] <- switch(input$dataset,
                                  'df1'=df1,
                                  'df2'=df2)
    result[['selection']] <- testing()
    return(result)
  })
  testing <- function() {
    list(selected=as.numeric(input$name_table_rows_selected))
  } 
  output$name_table <- DT::renderDataTable({
    DT::datatable(getDataset()[['dataset']],
                  options=list(pageLength=5),
                  selection=getDataset()[['selection']])

  })
  name_proxy = DT::dataTableProxy('name_table')
}