【问题标题】:R Shiny selectedInput inside renderDataTable cellsR Shiny selectedInput 在 renderDataTable 单元格内
【发布时间】:2017-02-22 13:17:48
【问题描述】:

我寻找将 selectedInputs 放入 renderDataTable 单元格的解决方案。我找到了 js 解决方案:https://datatables.net/examples/api/form.html,但是我不知道如何在 shinyjs 中将此解决方案实现为 renderDataTable 对象。我将不胜感激如何在闪亮中实现可编辑的 renderDataTable 的提示/想法/解决方案。

【问题讨论】:

    标签: html r datatables shiny dt


    【解决方案1】:

    与此非常相似:adding a column with TRUE/FALSE and showing that as a checkbox

    library(shiny)
    library(DT) 
    runApp(list(
      ui = basicPage(
        h2('The mtcars data'),
        DT::dataTableOutput('mytable'),
        h2("Selected"),
        tableOutput("checked")
      ),
    
      server = function(input, output) {
        # helper function for making checkbox
        shinyInput = function(FUN, len, id, ...) { 
          inputs = character(len) 
          for (i in seq_len(len)) { 
            inputs[i] = as.character(FUN(paste0(id, i), label = NULL, ...)) 
          } 
          inputs 
        } 
        # datatable with checkbox
        output$mytable = DT::renderDataTable({
          data.frame(mtcars,Rating=shinyInput(selectInput,nrow(mtcars),"selecter_",
                                                choices=1:5, width="60px"))
        }, selection='none',server = FALSE, escape = FALSE, options = list( 
          paging=TRUE,
          preDrawCallback = JS('function() { 
    Shiny.unbindAll(this.api().table().node()); }'), 
          drawCallback = JS('function() { 
    Shiny.bindAll(this.api().table().node()); } ') 
        ) )
        # helper function for reading checkbox
        shinyValue = function(id, len) { 
          unlist(lapply(seq_len(len), function(i) { 
            value = input[[paste0(id, i)]] 
            if (is.null(value)) NA else value 
          })) 
        } 
        # output read checkboxes
        output$checked <- renderTable({
          data.frame(selected=shinyValue("selecter_",nrow(mtcars)))
        })
      }
    ))
    

    请注意,如果您重新渲染表格,输入将不起作用,除非您添加一些额外的代码来取消绑定。

    编辑:

    假设表中的数据是反应性的,因此它会发生变化,并且表会重新呈现。您需要在这里按照@yihui 明确解除绑定:https://groups.google.com/forum/#!msg/shiny-discuss/ZUMBGGl1sss/zfcG9c6MBAAJ

    所以你需要在 UI 中添加:

    tags$script(HTML("Shiny.addCustomMessageHandler('unbind-DT', function(id) {
              Shiny.unbindAll($('#'+id).find('table').DataTable().table().node());
            })"))
    

    然后在服务器中,每当您重新渲染数据表时,您都会触发该函数:

    session$sendCustomMessage('unbind-DT', 'mytable')
    

    colnames 参数是列名的向量,因此当您指定长度为 FALSE 的向量时,它会为您提供一个包含一列名为 FALSE 的表。我不确定从数据表中删除列名的直接方法。这本身就是一个很好的 SO 问题。

    【讨论】:

    • 当我选择 selectInput 值时,您的解决方案选择行。选择 selectInput 值时可以禁用行选择吗?
    • 如果第一行的值发生变化,是否可以更新表中所有选定的输入?
    • 如果我想显示没有列名的 data.table (colnames = FALSE),如果它有按钮,它根本不会显示。这是什么原因?
    • 你能解释一下'add some extra code to unbind'是什么意思吗?
    • 第一个问题:我不明白你的意思。请编辑您的主要问题或打开一个新问题。 colnames 的第二件事似乎是一个错误,我将在 github 上报告。我将编辑我的答案以解释第三件事。
    【解决方案2】:

    为什么不使用 DT 的标准功能(Shiny.bindAll)

    示例(在第一行的控制台打印选择中)

    library(shiny)
    library(DT)
    mymtcars = mtcars
    mymtcars$id = 1:nrow(mtcars)
    runApp(
      list(ui = fluidPage(
    
          DT::dataTableOutput("mytable")
        )
    
      , server = function(input, output, session) {
    
        observe({
          print(input$row1)
        })
    
        output$mytable = DT::renderDataTable({
          #Display table with select
          DT::datatable(cbind(Pick=paste0('
                                          <select id="row', mymtcars$id, '"> <option>1</option>
                                          <option>2</option></select>',""), mymtcars),
                        options = list(orderClasses = TRUE,
                                       lengthMenu = c(5, 25, 50),
                                       pageLength = 25 ,
    
                                       drawCallback= JS(
                                         'function(settings) {
                                         Shiny.bindAll(this.api().table().node());}')
                                       ),selection='none',escape=F)
    
    
        } )
    
      })
    )
    

    【讨论】:

      猜你喜欢
      • 2019-05-08
      • 2014-09-27
      • 2019-11-13
      • 2016-01-16
      • 2015-09-13
      • 2018-10-07
      • 2020-07-01
      • 2019-12-21
      • 2014-10-09
      相关资源
      最近更新 更多