【问题标题】:Adding radiobutton in shiny DT在闪亮的 DT 中添加单选按钮
【发布时间】:2018-10-08 13:01:17
【问题描述】:

我有一个 DT,我正在使用下面的代码添加另一个包含单选按钮的列。

library(shiny)
library(DT)
library(data.table)


ui <- fluidPage(
   sidebarLayout(
      sidebarPanel(
        tags$span("Dummy")
      ),
      mainPanel(
        DT::dataTableOutput("TableWithRadio"))
   )
)

server <- function(input, output) {
   output$TableWithRadio <- DT::renderDataTable({
      dt <- data.table(A = rnorm(1:10), B = rnorm(1:10))
      data.table(dt, Select = shinyInputModelingDB(radioButtons, nrow(dt), "radio_"))
   }, server = FALSE, escape = FALSE, rownames = F,
     options = list(paging = FALSE, searching = F, ordering = F,
     preDrawCallback = JS('function() { 
                          Shiny.unbindAll(this.api().table().node()); }'), 
     drawCallback    = JS('function() { 
                          Shiny.bindAll(this.api().table().node()); } ')

     ))

   shinyInputModelingDB = function(FUN, len, id, ...) { 
     inputs = character(len) 
     for (i in seq_len(len)) { 
       inputs[i] = as.character(FUN(paste0(id, i), choices = "", label = "",
                                 selected = F,  ...)) 
     } 
     return(inputs) 
   }
}

# Run the application 
shinyApp(ui = ui, server = server)

问题是我添加的单选按钮不在同一组下,因为用户可以选择多个单选按钮(存在于不同的行中)

我想要一个 DT,其中用户只能跨行从整个表中选择一个单选按钮。

有什么想法可以实现相同的目标吗?

【问题讨论】:

  • rhandsontables 的解决方案是否也有效?
  • @SeGa 我没有用过 rhandontables 所以不确定,但是如果我们能用 datatable 找到解决方案那就太好了
  • 也许这个answer可以帮助你?

标签: r html shiny


【解决方案1】:

也许这可能会有所帮助。原始问答来自here。我刚刚删除了这一行m=t(m)

单选按钮现在是独占的,但回调函数不适用于列,而是用于行,因此单选按钮暂时不返回任何内容。

library(shiny)
library(DT)
shinyApp(
  ui = fluidPage(
    title = 'Radio buttons in a table',
    DT::dataTableOutput('foo'),
    verbatimTextOutput("test")
  ),
  server = function(input, output, session) {
    m = matrix(
      c(round(rnorm(24),1), rep(3,12)), nrow = 12, ncol = 3, byrow = F,
      dimnames = list(month.abb, LETTERS[1:3])
    )
    for (i in seq_len(nrow(m))) {
      m[i, 3] = sprintf(
        if_else(i == 1,
                '<input type="radio" name="%s" value="%s" checked="checked"/>',
                '<input type="radio" name="%s" value="%s"/>'),
        "C", month.abb[i]
      )
    }

    output$foo = DT::renderDataTable(
      m, escape = FALSE, selection = 'none', server = FALSE,
      options = list(dom = 't', paging = FALSE, ordering = FALSE),
      callback = JS("table.rows().every(function() {
                    var $this = $(this.node());
                    $this.attr('id', this.data()[0]);
                    $this.addClass('shiny-input-radiogroup');
  });
                    Shiny.unbindAll(table.table().node());
                    Shiny.bindAll(table.table().node());")
    )
    output$test <- renderPrint(str(input$C))
    }
)

【讨论】:

    猜你喜欢
    • 2019-02-10
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2019-11-22
    • 2015-09-19
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多