Отрисовать раскрывающийся список для одного столбца в DT shiny и сделать таблицу редактируемой - PullRequest
0 голосов
/ 26 мая 2020

Моя цель - иметь раскрывающееся меню в столбце datatable и сделать таблицу доступной для редактирования и для других столбцов.
Я нахожу это решение для моего первого требования, и datatable можно отредактировать, поместив editable = TRUE. Я могу делать обе вещи по отдельности без проблем, но я не могу делать обе вещи вместе.

library(shiny)
library(DT)

ui <- fluidPage(
  title = 'Selectinput column in a table',
  h3("Source:", tags$a("Yihui Xie", href = "https://yihui.shinyapps.io/DT-radio/")),
  DT::dataTableOutput('foo'),
  verbatimTextOutput('sel')
)

server <- function(input, output, session) {
  data <- head(iris, 5)

  # adding column having dropdown items
  for (i in 1:nrow(data)) {
    data$species_selector[i] <- as.character(selectInput(paste0("sel", i), "", choices = unique(iris$Species), width = "100px"))
  }

  ## output for data table
  output$foo = DT::renderDataTable(
    data,
    escape = F,
    editable = T,
    selection = 'none',
    server = F,      # we need it to be 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-container');
      });
      Shiny.unbindAll(table.table().node());
      Shiny.bindAll(table.table().node());")
    ,rownames = F
  )

  # saving the proxy of table 
  proxy = dataTableProxy('foo')

  text <- reactive({
    # browser()
    (sapply(1:nrow(data), function(i) input[[paste0("sel", i)]]))
  })

  output$sel = renderPrint({
    # data$species_selector[1]
    text()
  })

  # this chunk is for update the table for changes done in ui. "This is a must have"
  observeEvent(input$foo_cell_edit, {
    info = input$foo_cell_edit
    str(info)
    i = info$row
    j = info$col + 1  # column index offset by 1
    v = info$value
    data[i, j] <<- DT::coerceValue(v, data[i, j])
    # replacing the data in the proxy
    replaceData(proxy, data, resetPaging = FALSE, rownames = FALSE)
  })
}


shinyApp(ui, server)

Когда я помещаю server = T, я могу редактировать таблицу без проблем, но я не могу получить выбранные значения раскрывающегося меню (которые мне нужны). И когда я помещаю server = F, я получаю выбранные значения в раскрывающемся списке, но затем, когда я пытаюсь отредактировать свою таблицу, отображается ошибка как "Предупреждение DataTables: table id = DataTables_Table_0 - Invalid JSON response. Для дополнительную информацию об этой ошибке см. http://datatables.net/tn/1 " Любая помощь или направление приветствуются.


Примечание: I знаю, что обе эти операции очень просты в редактировании, я не использую их, потому что у них есть другие ограничения, такие как кнопка поиска, условное форматирование и т. д. c.

...