Добавление радиообъектива в блестящий 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, в котором пользователь может выбрать только одну радиокнопку из всей таблицы по строкам.

Любые идеи, как я могу обойти достижение того же?

Всего 1 ответ


Может быть, это может быть полезно. Оригинальный Q / A пришел отсюда . Я просто удалил эту строку m=t(m) .

Радиообъекты теперь эксклюзивные, но функция обратного вызова не работает для столбцов, а для строк, поэтому radioButtons ничего не возвращает.

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))
    }
)

Есть идеи?

10000