Доступ к значениям переключателей в DataTable (блестящий)

#javascript #r #shiny #radio-button #dt

#javascript #r #блестящий #переключатель #dt

Вопрос:

У меня возникли проблемы с доступом к входным значениям переключателей, когда они встроены в DataTable в shiny. Я основываю свой код на этом примере: переключатели в DT

Он получает доступ к значениям при первом проходе и отображает их внизу, как показано на следующем снимке экрана:
Скриншот первого прохождения

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

После первого прохода входные данные больше не обновляются, чтобы отразить выбор переключателя. Исходные входные данные, похоже, зависают, и я не могу найти способ получить доступ к текущим значениям кнопок.

Заранее благодарю вас за помощь!

Вот код для приведенного выше примера:

 library(shiny)
library(DT)
library(data.table)
shinyApp(
  ui = fluidPage(
    title = 'Radio buttons in a table',
    selectInput('questions','Pick',c(1,2)),
    DT::dataTableOutput('foo'),
    verbatimTextOutput('sel')
  ),
  server = function(input, output, session) {
    
    myData = reactiveValues(m = NULL)
    temp = month.abb
    
    observeEvent(input$questions,{
      m = data.table(
        
        
        month1 = temp[1:5],
        A = '1',
        B = '2',
        C = '3',
        QWE = runif(5)
      )
      m[, A := sprintf(
        '<input type="radio" name="%s" value="%s"/>',
        month1, m[, A]
      )]
      m[, B := sprintf(
        '<input type="radio" name="%s" value="%s"/>',
        month1, m[, B]
      )]
      m[, C := sprintf(
        '<input type="radio" name="%s" value="%s"/>',
        month1, m[, C]
      )]
      
      myData$m = m
    })
    
    
    
    output$foo = DT::renderDataTable({
      m = myData$m
      print(m)
      
    }
    , escape = FALSE, selection = 'none', server = FALSE, rownames=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());")
    )
    output$sel = renderPrint({
      str(sapply(month.abb, function(i) input[[i]]))
    })
    }
)
 

Ответ №1:

Это потому, что вы сбрасываете m внутри observeEvent() . Если вы определяете его вне наблюдателя, он работает так, как ожидалось. Попробуйте это

   server = function(input, output, session) {
    
    myData <- reactiveValues(m = NULL)
    temp <- month.abb
    m <- data.table(
      month1 = temp[1:5],
      A = '1',
      B = '2',
      C = '3',
      QWE = runif(5)
    )
    
    observeEvent(input$questions,{
     
      m[, A := sprintf(
        '<input type="radio" name="%s" value="%s"/>',
        month1, m[, A]
      )]
      m[, B := sprintf(
        '<input type="radio" name="%s" value="%s"/>',
        month1, m[, B]
      )]
      m[, C := sprintf(
        '<input type="radio" name="%s" value="%s"/>',
        month1, m[, C]
      )]
      
      myData$m = m
    })
    
    
    
    output$foo = DT::renderDataTable({
      m = myData$m
      print(m)
      
    }
    , escape = FALSE, selection = 'none', server = FALSE, rownames=FALSE, # editable=TRUE,
    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());")
    )
    
    
    output$sel = renderPrint({
      str(sapply(month.abb, function(i) input[[i]]))
    })
  }