2

入力が SelectInput によって選択される編集可能な DataTable (パッケージ DT) を使用すると、行われた編集が本来あるべき場所に保存されません。

特定の変数を選択すると、たとえば最初の行にデータテーブルの行 50 ~ 60 が表示されます。それらを編集すると、行 50 ~ 60 ではなく、最初の行に編集が保存されます。

以下の例では、変数 versicolor を選択して setosa を削除できます。次に、Petal.Length を乱数に編集します。編集は行 51 に保存する必要がありますが、代わりに行 1 に保存されます。

編集が行番号 (indexrow) に保存されるように、インデックス列に基づく回避策を考えています。しかし、私はそれを行う方法がわかりません。

#Packages
library(shiny)
library(shinyalert)
library(shinydashboard)
library(leaflet)
library(leaflet.extras)
library(DT)

#data
iris = iris

#Shiny-app (ui)
header = dashboardHeader(title = "SelectInput DataTable example")

sidebar = dashboardSidebar(selectInput("species", "Choose species:  ",    choices = iris$Species, selected = "setosa",  multiple = TRUE))

body = dashboardBody(fluidRow(dataTableOutput("table")))

ui = dashboardPage(skin = "red", header, sidebar, body)

#Server
server <- function(input, output, session) {


  output$table = DT::renderDataTable(iris[iris$Species %in% input$species,], editable = TRUE)

  proxy = dataTableProxy('table')

  observeEvent(input$table_cell_edit, {
    info = input$table_cell_edit
    str(info)
    i = info$row
    j = info$col
    v = info$value
    iris[i, j] <<- DT::coerceValue(v, iris[i, j])
    replaceData(proxy, iris, resetPaging = FALSE)  # important
  })
}

shinyApp(ui = ui, server = server)
4

1 に答える 1