首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >闪亮- DT -单行选择,跨几个DT::表

闪亮- DT -单行选择,跨几个DT::表
EN

Stack Overflow用户
提问于 2017-06-21 09:40:28
回答 1查看 843关注 0票数 0

在下面的示例中,我有3个DT::datatables。我希望用户能够从所有这些表中选择最多一行。因此,我使用dataTableProxyselectRow,根据文档中的“操作现有的DataTables实例”一节。效果很好。

但是,在我的应用程序中,我有24个表(调用值N)。如果我试图使下面的代码适应我的24个表页,我会得到大量的代码行。

有什么更明智的方法来做到这一点?

特别是,我如何能够:

  • 动态宣布观察员?(由user5029763回答)
  • 知道最后单击了哪个表(不是行)吗?(即)如何重写reactiveText()?)

编辑:我在下面的代码中复制了user5029763的答案(见下文)。

代码语言:javascript
运行
复制
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是:“您从Yth表中选择了Xth行”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-21 13:56:31

编辑后:

你可以试试模块。另一种方式是lapply

代码语言:javascript
运行
复制
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)
      }
    })
})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44672398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档