Извлечение значений выбранных переключателей в блестящей DT - PullRequest
0 голосов
/ 05 сентября 2018

Справочная информация: у меня блестящий DT в диалоговом окне модальности, содержащее переключатели в столбцах, я хочу выполнить некоторую обработку, основанную на выборе переключателя в DT

Проблема: я не могу понять, как извлечь значение выбранной радиокнопки из DT

Ниже приведен воспроизводимый пример для того же.

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

shinyApp(
  ui = fluidPage(
    title = 'Radio buttons in a table',

    actionBttn(inputId = "btnContinue",label = "Continue",style = "material-flat")

  ),
  server = function(input, output, session) {

    dtWithRadioButton <- reactiveValues(dt = NULL)

    observeEvent(input$btnContinue,{

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

      dt <- data.table(m)
      v <- LETTERS[1:12]

      dt <- cbind(v,dt)

      dtWithRadioButton$dt <- dt # setting reactive value

      showModal(modalDialog(
        size = "l",easyClose = F,fade = T,
        renderDataTable(datatable(dt, selection = "none",escape = FALSE, options = list(dom = 't') , rownames = F)),
       footer =  tagList(
          actionBttn(inputId = "btnCancel",label = "Cancel",style = "float",size="sm",color="warning"),
          actionBttn(inputId = "btnProcess",label = "Process",style = "float",size="sm",color="success")
        )
      ))
    })

  observeEvent(input$btnProcess,{

    dt <- dtWithRadioButton$dt # accessing the reactive value

    # do some processing based on the radio button selection

  })

  observeEvent(input$btnCancel,{
    removeModal(session)
  })




  }
)

При нажатии кнопки «Продолжить» пользователю отображается всплывающее окно с блестящей DT с переключателем. После того, как пользователь делает выбор с помощью переключателя. Я хочу запустить процесс по щелчку btnProcess

1 Ответ

0 голосов
/ 05 сентября 2018

Вы можете сделать:

library(shiny)
library(DT)
library(shinyWidgets)

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

shinyApp(

  ui = fluidPage(
    title = 'Radio buttons in a table',

    actionBttn(inputId = "btnContinue", label = "Continue", 
                 style = "material-flat")

  ),

  server = function(input, output, session) {

    dtWithRadioButton <- reactiveValues(dt = m)

    observeEvent(input$btnContinue,{

      showModal(modalDialog(
        size = "l", easyClose = FALSE, fade = TRUE,
        DTOutput("datatable"),
        footer =  tagList(
          actionBttn(inputId = "btnCancel", label = "Cancel", 
                       style = "float", size="sm", color="warning"),
          actionBttn(inputId = "btnProcess", label = "Process", 
                       style = "float", size="sm", color="success")
        )
      ))
    })

    output$datatable <- renderDT(
      datatable(dtWithRadioButton$dt, selection = "none", escape = FALSE, 
                options = list(
                  dom = 't',
                  paging = FALSE,
                  ordering = FALSE
                ), 
                callback = 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());"),
                rownames = TRUE), 
      server = FALSE
    )

    observeEvent(input$btnProcess,{
      dt <- dtWithRadioButton$dt # accessing the reactive value
      # do some processing based on the radio button selection
      for(month in month.abb){
        print(paste0(month, ": ", input[[month]]))
      }
    })

    observeEvent(input$btnCancel,{
      removeModal(session)
    })

  }
)

Тогда значение выбранной кнопки будет в input$Jan для первой строки, input$Feb для второй строки и т. Д.

...