У меня проблемы с доступом к входным значениям переключателя, когда они вставлены в DataTable в блестящем цвете. Я основываю свой код на следующем примере: Radio Buttons in 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]]))
    })
    }
)
0
Margaret 13 Фев 2021 в 00:18

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]]))
    })
  }
0
YBS 13 Фев 2021 в 01:06