R Shiny DT - редактировать значения в таблице с реактивным

Можно ли обновить реактивный источник данных, отредактировав DT :: DataTable? Приведенный ниже код основан на этом коде с изменением, что x делается реактивным. Проблема начинается при попытке изменить x в наблюдаемом событии.

Цель наличия x reactive заключается в том, что я намереваюсь получить его из внешней базы данных, а затем внести изменения в DT :: DataTable, чтобы записать обратно в базу данных, чтобы она оставалась синхронизированной с тем, что видит пользователь (я в порядке с выполнением что - это не часть вопроса).

library(shiny)
library(DT)
shinyApp(
  ui = fluidPage(
    DTOutput('x1')
  ),
  server = function(input, output, session) {
    x = reactive({
      df <- iris
      df$Date = Sys.time() + seq_len(nrow(df))
      df
    })
    output$x1 = renderDT(x(), selection = 'none', editable = TRUE)

    proxy = dataTableProxy('x1')

    observeEvent(input$x1_cell_edit, {
      info = input$x1_cell_edit
      str(info)
      i = info$row
      j = info$col
      v = info$value

      # problem starts here
      x()[i, j] <<- isolate(DT::coerceValue(v, x()[i, j])) 
      replaceData(proxy, x(), resetPaging = FALSE)  # important
    })
  }
)

person Vlad    schedule 22.05.2018    source источник
comment
Я думаю, вы хотите взглянуть на пакет с ручным управлением   -  person Bertil Baron    schedule 22.05.2018


Ответы (2)


Я не уверен, правильно ли я вас понял, но, возможно, это решение может вам немного помочь. Я изменил ваш реактив на объект reactiveValues ​​и удалил строку replaceData.

library(shiny)
library(DT)
shinyApp(
  ui = fluidPage(
    DTOutput('x1'),
    verbatimTextOutput("print")
  ),
  server = function(input, output, session) {
    x = reactiveValues(df = NULL)

    observe({
      df <- iris
      df$Date = Sys.time() + seq_len(nrow(df))
      x$df <- df
    })

    output$x1 = renderDT(x$df, selection = 'none', editable = TRUE)

    proxy = dataTableProxy('x1')

    observeEvent(input$x1_cell_edit, {
      info = input$x1_cell_edit
      str(info)
      i = info$row
      j = info$col
      v = info$value

      # problem starts here
      x$df[i, j] <- isolate(DT::coerceValue(v, x$df[i, j]))
    })

    output$print <- renderPrint({
      x$df
    })
  }
)
person SeGa    schedule 22.05.2018
comment
У меня проблема в том, что если вы измените столбец 1, info $ col на самом деле покажет 0. Не знаю, почему я получаю номера столбцов, равные n -1 в моем приложении. Кто-нибудь еще видел это? Я завтра протестирую этот фиктивный код приложения - person Mark; 03.10.2018
comment
У меня такая же проблема, но простое добавление 1 в столбец тоже не работает. - person Simon Woodward; 20.05.2019
comment
В самом деле, похоже, что это происходит, когда rownames равны NULL, что вызывает ошибку при редактировании первого столбца и в противном случае редактирует неправильный столбец. Но добавление 1 к j, похоже, исправляет это для меня. - person SeGa; 20.05.2019

Если вы не показываете имена строк в своем DT, вам следует добавить 1 к info$col, чтобы получить правильный столбец, то есть j = info$col + 1.

person Charles Knightley    schedule 26.02.2019