繁体   English   中英

在闪亮的DT中添加单选按钮

[英]Adding radiobutton in shiny DT

我有一个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,其中用户只能从整个表的行中选择一个单选按钮。

有什么想法可以解决吗?

也许这会有所帮助。 原始Q / A来自此处 我刚刚删除了这一行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))
    }
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM