首页 > 解决方案 > 如何修复可编辑的 DT::datatable 抛出:“split.default 中的错误:第一个参数必须是向量”

问题描述

我正在尝试制作一个接受数据框并从中生成可编辑数据表的模块。这一直有效,直到我通过进行以下更改使模块能够接受多个编辑:

editTable <- reactive({
        datatable(
          reactives$input,
          #editable = T                      #PREVIOUS (working fine)
          editable = list(target = "all"),   #NEW (problem-causing)
          rownames = F
        )
      })

包含标记的代码#NEW后,单击labelDo(在本例中为“编辑”)会导致应用程序崩溃并显示以下错误消息:

Warning: Error in split.default: first argument must be a vector

我能找到的最接近这个问题的问题就在这里。该用户的问题是相同的,但我的问题并没有通过将rownames = FALSE其放入datatable()上面的代码段中来解决(据称他们的问题是)。

请继续运行以下模块和应用程序,并尝试编辑表中的数字之一。单击“编辑”,您将获得相同的结果。

模块:

editrUI <- function(id, labelDo, labelUndo) {
  ns <- NS(id)
  tagList(
    dataTableOutput(ns("out")),
    actionButton(
      inputId = ns("do"),
      label = labelDo
    ),
    actionButton(
      inputId = ns("undo"),
      label = labelUndo
    )
  )
}

editrServer <- function(id, dataFrame) {
  moduleServer(
    id,
    function(input, output, session){
      
      reactives <- reactiveValues()
      
      reactives$input <- NULL
        
      observe({
        reactives$input <- dataFrame
      })
      
      
      editTable <- reactive({
        datatable(
          reactives$input,
          #editable = T                    #old
          editable = list(target = "all"), #new
          rownames = F
        )
      })
      
      output$out <- renderDataTable(
        editTable()
      )
      
      observeEvent(input$do , {
        reactives$input <<- editData(reactives$input, input$out_cell_edit, rownames = F) 
      })
      
      observeEvent(input$undo , {
        reactives$input <- dataFrame
      })
      
      return(reactive({reactives$input}))
    }
  )
}

应用程序:

library(shiny)

source(
  #source of module
)

a <- 1:5
df <- tibble(a, a*2)

ui <- fluidPage(
    editrUI(id = "id", labelDo = "Edit", labelUndo = "Undo")
)

server <- function(input, output) {
    editrServer(id = "id", dataFrame = df)
}

# Run the application 
shinyApp(ui = ui, server = server)

标签: rshinydt

解决方案


似乎此错误是在input$out_cell_edit为 NULL 时引起的(未编辑任何单元格)。

您可以修复它,req(input$out_cell_edit)以防万一input$out_cell_edit为 NULL 时取消该事件。

此外,您不需要使用<<-分配给反应值。

      observeEvent(input$do , {
        req(input$out_cell_edit)
        reactives$input <- editData(reactives$input, input$out_cell_edit, rownames = F) 
      })

推荐阅读