首页 > 解决方案 > 将 DTedit 与“新行”ActionButton 集成

问题描述

我正在尝试使用单独的操作按钮将行附加到 dtedit 对象。该按钮创建一行,我希望它附加到 dtedit 表。我让它工作,所以这一切都会发生,但 dtedit 函数似乎无法识别数据,因为当我尝试使用内置的“编辑”按钮时,字段不会预先填充在模式中,因为它们应该。

我在下面包含了一个可重现的示例。您将看到“添加行”功能有效,但是当您单击一行并按编辑时,模式无法识别数据。

*编辑DTedit包加载和删除view.label.cols

devtools::install_github('jbryer/DTedit')
library(DTedit)

ui <- fluidPage(
      actionButton('addrow', "New Row"),
      uiOutput("table")
)

server <- function(input, output) {

  df <- data.frame('Order' = integer(), 'Category' = character(), 'Name' = character(), stringsAsFactors = F)
  table.reactive <- reactiveVal(df)
  dtedit(input, output,
         name = 'table',
         thedata = df,
         edit.cols = c('Order', 'Category', 'Name'),
         edit.label.cols = c('Order', 'Category', 'Name'),
         input.types = c( Order = 'numericInput',
                          Category='textInput',
                          Name='textInput'
         ),
         view.cols = c('Order', 'Category', 'Name'),
         callback.update = plandrill.update.callback,
         callback.insert = plandrill.insert.callback,
         callback.delete = plandrill.delete.callback,
         show.copy = F, show.insert = F)

  dt.proxy <- DT::dataTableProxy("tabledt")

  ## append row
  observeEvent(input$addrow, {
    row <- data.frame(nrow(table.reactive()) + 1, "ABC", "DEF", stringsAsFactors = F)
    appended_table = rbind(table.reactive(), row)
    table.reactive(appended_table)
    replaceData(dt.proxy,
               appended_table,
               rownames = FALSE)
  })

}

shinyApp(ui = ui, server = server)

标签: rshinydt

解决方案


jbryer/DTedit制作通过thedata参数传递的数据帧的本地副本,并将其内部存储在results$thedata. results$thedata用于后续的数据表编辑,不会replaceData.

您需要的效果可以通过修改版本DTedit来实现,这是我(在其他人的帮助下)编写的,可以在 Github 上找到DavidPatShuiFong/DTedit

图书馆(DTedit)

ui <-流体页面(
  actionButton('addrow', "新行"),
  uiOutput("表")
)

服务器 <- 功能(输入,输出){
  
  df <- data.frame('Order' = integer(),
                   '类别' = 字符(),
                   '名称' = 字符(),
                   字符串AsFactors = F)
  table.reactive <- reactiveVal(df)
  dtedit(输入,输出,
         名称='表',
         thedata = table.reactive,
         edit.cols = c('Order', 'Category', 'Name'),
         edit.label.cols = c('Order', 'Category', 'Name'),
         input.types = c( Order = 'numericInput',
                          类别='文本输入',
                          名称='文本输入'
         ),
         view.cols = c('Order', 'Category', 'Name'),
         # callback.update = plandrill.update.callback,
         # callback.insert = plandrill.insert.callback,
         # callback.delete = plandrill.delete.callback,
         show.copy = F,show.insert = F)
  
  dt.proxy <- DT::dataTableProxy("tabledt")
  
  ## 追加行
  观察事件(输入$添加,{
    行 <- data.frame(Order = nrow(table.reactive()) + 1,
                      类别 = "ABC",
                      名称 = "DEF",
                      字符串AsFactors = F)
    appended_table = rbind(table.reactive(), 行)
    table.reactive(appended_table)
  })
}

闪亮应用(用户界面 = 用户界面,服务器 = 服务器)

在这个版本的 中DTedit,数据框作为reactiveVal( table.reactive) 传递,并且DTedit' 的副本会在更改时table.reactive更改。

我需要禁用在您的示例中定义各种回调,因为未定义回调。我还需要明确标记数据框中的列row

更多示例可以在小插图中看到,并通过Github 上的 README.md链接。


推荐阅读