簡體   English   中英

閃亮-DT-跨多個DT :: table的單行選擇

[英]Shiny - DT - Single row selection, across several DT::tables

在下面的示例中,我有3個DT::datatables 我希望用戶能夠從所有這些表中選擇不超過一行。 selectRow ,按照文檔中 “操作現有的DataTables實例”部分,使用dataTableProxyselectRow 工作正常。

但是,在我的應用程序中,我有24個(稱為值N )表。 如果我嘗試將下面的代碼改編到我的24個表格頁面,則會得到大量的代碼行。

什么是更聰明的方法?

特別是,我該如何:

  • 動態聲明觀察者? (由用戶5029763回答)
  • 知道最后單擊了哪個表(不是行)? (即,如何重新編寫reactiveText() ?)

編輯:我在下面的代碼中復制了user5029763的答案(請參見下文)。

DTWrapper <- function(data, pl = 5, preselec = c()){
  datatable(data,
            options = list(pageLength = pl, dom='t',ordering=F),
            selection = list(mode = 'single', selected= preselec),
            rownames = FALSE)
}
resetRows <- function(proxies, self){
  for (i in 1:length(proxies)){
    if (self != i){
      proxies[[i]] %>% selectRows(NULL)
    }
  }
}

lapply(1:3, function(id) {
  observe({
    rownum <- input[[paste0("tab",id,"_rows_selected")]]
    if (length(rownum) > 0) { resetRows(proxyList(), id) }
  })
})

server = function(input, output) {

  output$tab1 <- DT::renderDataTable(DTWrapper(head(mtcars[,1:3]), input$selectTop))
  output$tab2 <- DT::renderDataTable(DTWrapper(head(mtcars[,1:3]), input$selectTop))
  output$tab3 <- DT::renderDataTable(DTWrapper(head(mtcars[,1:3]), input$selectTop))

  proxyList <- reactive({
    proxies = list()
    for (i in 1:3){
      tableID <- paste("tab", i, sep="")
      proxies[[i]] = dataTableProxy(tableID)
    }
    return(proxies)
  }) 

  reactiveText <- reactive({
    rownum1 <- input$tab1_rows_selected
    rownum2 <- input$tab2_rows_selected
    rownum3 <- input$tab3_rows_selected
    if (length(rownum1) > 0){return(c(rownum1, 1))}
    if (length(rownum2) > 0){return(c(rownum2, 2))}
    if (length(rownum3) > 0){return(c(rownum3, 3))}
  })

  output$txt1 <- renderText({
    paste("You selected row ", reactiveText()[1]
          , " from table ", reactiveText()[2], ".", sep="")
  })
}

shinyApp(
  ui = fluidPage(
    fluidRow(column(4,DT::dataTableOutput("tab1"))
             , column(4,DT::dataTableOutput("tab2"))
             , column(4, DT::dataTableOutput("tab3")))
    ,fluidRow(column(4,textOutput("txt1")))
  ),
  server = server
)

textOutput為:“您從第textOutput個表中選擇了第textOutput行”。

編輯后:

您可以嘗試使用模塊 另一種方式是a lapply

lapply(1:3, function(id) {
    observe({
      rownum <- input[[paste0("tab",id,"_rows_selected")]]
      if (length(rownum) > 0) {
        resetRows(proxyList(), id)

        msg <- paste0("You selected row ", rownum, ", from table ", id, ".")
        output$txt1 <- renderText(msg)
      }
    })
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM