web-dev-qa-db-ja.com

R Shiny DT-リアクティブでテーブルの値を編集

DT :: DataTableを編集して反応データソースを更新することはできますか?以下のコードは このコード に基づいていますが、xはリアクティブになります。問題は、observeEventでxを変更しようとしたときに始まります。

Xのリアクティブを使用する目的は、外部データベースからソースを取得し、ユーザーに表示されるものと同期を保つように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
    })
  }
)
9
Vlad

あなたを正しく理解しているかどうかはわかりませんが、この解決策が少し役立つかもしれません。私はあなたのリアクティブをreactValuesオブジェクトに変更し、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
    })
  }
)
13
SeGa

DTで行名を表示しない場合は、info$colに1を追加して正しい列、つまりj = info$col + 1を取得する必要があります。

2