2017-09-22 70 views
1

在数据表中,根据是否选择相应的行,某些值应该会更改。让我头疼的是:当数据更新时,表格被重写,选择消失。Shiny DT :: datatable - 选择行时更改表格内容

我一直在处理这个挑战几个小时,但还没有遇到一个解决方案。大多数时候我在stackoverflow找到解决我的问题的解决方案,但这次我没有。

在下面的例子中,最后一列应该显示行的选择状态。我试图跟踪选定的行,并在表重写时预先选择它们。但我无法弄清楚如何使它工作。该代码不起作用,但(希望)显示我需要什么。

library(shiny) 
library(DT) 
mymtcars = mtcars[1:5, 1:2] 

runApp(
    list(ui = fluidPage(DT::dataTableOutput("mytable")), 

    server = function(input, output, session) { 
     rowSelect <- reactive({ 
      a <- rep(FALSE,5) 
      a[input$mytable_rows_selected] <- TRUE 
      return(a) 
     }) 

     output$mytable = DT::renderDataTable(
      cbind(mymtcars, v=rowSelect()), 
      options = list(dom="t", 
          ordering=FALSE), 
      selection=list(mode='multiple', 
          selected=(1:5)[rowSelect()], 
          target='row') 
     ) 
    }) 
) 

顺便说一句,不太优雅,但也有可能的方法是增加复选框,而不是数据表行选择机制的一列。我也尝试过,但有类似的问题。一切都按照我想要的方式实现,直到我将反应性列添加到我的数据中。

回答

1

你差不多了!你必须把你的包裹表datatable

output$mytable <- DT::renderDataTable(
    datatable(cbind(mymtcars, v=rowSelect()), 
       options = list(dom = "t",ordering = FALSE), 
       selection = list(mode = "multiple", 
           selected =(1:5)[rowSelect()], 
           target = "row")) 
) 

enter image description here

+0

对不起,我不能投你的答案有用,因为我的名声太低:-(也许你也知道如何启动表的所有生产线selcted ? – Hans

+0

@Hans在数据表中应该有一个选项,比如'selected =“all”' – PoGibas

+0

这是非常棘手的,因为这个选项已经被用于记住之前的选择(在表重写之前)解释“选择”为“未选中”,反之亦然,让'v =!rowSelect()',但我认为这将更优雅,而不是“欺骗”这种方式,但无论如何,非常感谢你的答案h大大地帮助我。 – Hans