【问题标题】:Edit datatable using autofill extension?使用自动填充扩展编辑数据表?
【发布时间】:2019-06-09 17:18:02
【问题描述】:

如何在可编辑表格上使用自动填充扩展?在下面的示例modified from this previous question 中,未捕获自动填充操作(使用蓝色方块填充表格)。

谢谢

伊恩

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, extensions = 'AutoFill', options = list(autoFill = 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

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

output$print <- renderPrint({
  x$df
})
}
)

【问题讨论】:

  • 闪亮的数据表扩展似乎存在一些问题,请参见此处:rstudio.github.io/DT/extensions.html。外面闪亮你的例子效果很好。解决方法的想法可能是在更改后立即捕获应用程序的状态(因为它确实发生了变化但很快恢复),...但据我所知,捕获更改是不可能的,...
  • 谢谢 - 我会提出潜在的错误

标签: r dt


【解决方案1】:

这是一种方法。它需要server = FALSE

library(shiny)
library(DT)

callback <- c(
  "var tbl = $(table.table().node());",
  "var id = tbl.closest('.datatables').attr('id');",
  "table.on('autoFill', function(e, datatable, cells){",
  "  var out = [];",
  "  for(var i=0; i<cells.length; ++i){",
  "    var cells_i = cells[i];",
  "    for(var j=0; j < cells_i.length; ++j){",
  "      var c = cells_i[j];",
  "      var value = c.set === null ? '' : c.set;", # null causes problem in R
  "      out.push({row: c.index.row+1, col: c.index.column, value: value});",
# if you want to color the autofilled cells, uncomment the the two lines below  
#  "      $(table.cell(c.index.row, c.index.column).node())",
#  "        .css('background-color', 'yellow');",
  "    }",
  "  }",
  "  Shiny.setInputValue(id + '_cells_filled:DT.cellInfo', out);",
  "  table.rows().invalidate();", # this updates the column type
  "});"
)

ui <- fluidPage(
  br(),
  DTOutput("dt"),
  br(),
  verbatimTextOutput("table")
)

server <- function(input, output){

  dat <- iris[1:5,]

  output[["dt"]] <- renderDT({
    datatable(dat, 
              editable = list(target = "cell"),
              selection = "none",
              extensions = "AutoFill",
              callback = JS(callback), 
              options = list(
                autoFill = TRUE
              )
    )
  }, server = FALSE)

  Data <- reactive({
    info <- rbind(input[["dt_cells_filled"]], input[["dt_cell_edit"]])
    if(!is.null(info)){
      info <- unique(info)
      info$value[info$value==""] <- NA
      dat <<- editData(dat, info)
    }
    dat
  })

  output[["table"]] <- renderPrint({Data()})  
}

shinyApp(ui, server)


编辑

server = TRUE 替换就足够了

dat <<- editData(dat, info)

dat <<- editData(dat, info, proxy = "dt")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-10
    • 2021-01-29
    • 2011-11-15
    • 2018-02-19
    • 1970-01-01
    • 2020-08-23
    • 2020-02-27
    • 2019-08-09
    相关资源
    最近更新 更多