Добавить несколько радиогрупп в DT - PullRequest
0 голосов
/ 30 октября 2019

Мне было интересно, возможно ли добавить две (или более) кнопки радиогруппы в таблицу DT в блестящем. На этой странице кажется, что добавить одну довольно просто: https://rstudio.github.io/DT/011-radio.html

Тем не менее, я борюсь с возможностью добавить две радиогруппы. Вот мой код:

library(shiny)
ui <- bootstrapPage(DT::dataTableOutput("DT_table"))

server <- function(input, output) {

output$DT_table <- DT::renderDataTable({
m <- matrix(
  as.character(1:5), nrow = 12, ncol = 5, byrow = TRUE,
  dimnames = list(month.abb, LETTERS[1:5])
)

n <- matrix(
  as.character(1:5), nrow = 12, ncol = 5, byrow = TRUE,
  dimnames = list(month.abb, paste("P", LETTERS[1:5], sep = "_"))
)
for (i in seq_len(nrow(m))) {
  m[i, ] = sprintf(
    '<input type="radio" name="%s" value="%s"/>',
    month.abb[i], m[i, ]
  )
}

for (i in seq_len(nrow(n))) {
  n[i, ] = sprintf(
    '<input type="radio" name="%s" value="%s"/>',
    paste0("T2", month.abb[i]), n[i, ]
  )
}

dataset <- as.data.frame(cbind(m, n))
DT::datatable(dataset, selection = 'none', escape = FALSE, options = list(dom = 't', paging = FALSE, ordering = FALSE),
          callback = DT::JS("table.rows().every(function(i, tab, row) {
      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());")
)}, server = FALSE)

observe({
  print(input$Jan)
  print(input$T2Jan)
})
}

shinyApp(ui = ui, server = server)

Я ясно вижу, что проблема связана с моим аргументом обратного вызова, который применяет текст глянцевый-input-radiogroup / id ко всей строке, а не к каждой радиогруппе каждой строки,Как видите, мой ввод $ T2Jan всегда равен NULL. Я действительно новичок в javascript, поэтому понятия не имею, с чего начать.

Как вы думаете, возможно ли это с помощью небольшого количества манипуляций с javascript, или лучше просто создать другой объект данных рядом с первым?

1 Ответ

1 голос
/ 30 октября 2019

Вы можете использовать это callback:

callback <- c(
  "  $('input[type=radio]').on('click', function(){",
  "    var name = $(this).attr('name');",
  "    var value = $('input[name=' + name + ']:checked').val();",
  "    Shiny.setInputValue(name, value);",
  "  });"
)

и:

DT::datatable(dataset, selection = 'none', escape = FALSE, 
              options = list(dom = 't', paging = FALSE, ordering = FALSE),
              callback = JS(callback) 
)
...