在闪亮的数据表中编辑多个单元格 [英] Editing multiple cells in a datatable in shiny

查看:22
本文介绍了在闪亮的数据表中编辑多个单元格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我之前问过这个问题 - 将可编辑的闪亮数据表写入.csv 文件尝试在闪亮的数据表中编辑单元格并用编辑后的数据替换原始数据.

I asked this question earlier - Write editable shiny Datatable to .csv file Trying to edit cells in a shiny datatable and replace the original data with the edited data.

我能够弄清楚如何编辑数据表中的单个单元格,但是如果编辑了多个单元格,则只保存最后一次编辑.

I was able to figure out how to edit a single cell in the datatable, however if multiple cells are edited only the last edit is saved.

代码:

library(shiny)
library(shinydashboard)
library(tidyverse)
library(DT)


users <- reactiveFileReader(
  intervalMillis = 1000,  
  NULL,
  filePath = 'appData/userTest.csv',
  readFunc = read.csv,
  stringsAsFactors = FALSE
)

header <- dashboardHeader(title = "demo")
sidebar <- dashboardSidebar(uiOutput('sidebar'))
body <- dashboardBody(uiOutput("body"))

f1 <- fluidRow(
  box(
    dataTableOutput('userTable'),
    width = 6
  )
)

ui <- dashboardPage(title = 'admin function test', header, sidebar, body, skin='blue')

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

  output$body <- renderUI({
    tabItems(
      tabItem(
        tabName = 'admin', class = 'active', h2(f1)
      )
    )
  })

  output$sidebar <- renderUI({
    sidebarMenu(id = 'sidebarmenu',
                menuItem("admin", tabName = "admin", icon = icon("adjust")),
                actionButton("do", 'save', icon = icon('redo'))
    )
  })

  observeEvent(
    input$do,{
      write.csv(edited(),'appData/userTest.csv', row.names = FALSE)
    })

  output$userTable <- renderDataTable({
    DT::datatable(users(),
                  editable = TRUE,
                  rownames = FALSE)
  })

  edited <- reactive({editData(users(), input$userTable_cell_edit, proxy = NULL, rownames = FALSE, resetPaging = FALSE)})
}

shinyApp(ui = ui, server = server)

数据:

   userName      start        end
1      John 06/08/2019 01/10/2019
2      Mary 01/01/2019 01/10/2019
3      Mike 23/10/2019 01/10/2019
4     Steve 25/07/2019 07/02/2015
5      Kate 01/01/2019 29/04/2019

我想这是因为 editData() 函数一次只记录一个编辑.如何一次性编辑和保存多个单元格?

I imagine this is because the editData() function records only a single edit at a time. How can multiple cells be edited and saved in one go?

推荐答案

见下文,这将允许多次更改,并且每个更改都会被跟踪.

See below, this will allow multiple changes and each one is tracked.

library(shiny)
library(shinydashboard)
library(tidyverse)
library(DT)

header <- dashboardHeader(title = "demo")
sidebar <- dashboardSidebar(
  sidebarMenu(id = 'sidebarmenu',
              menuItem("admin", tabName = "admin", icon = icon("adjust")),
              downloadButton("downloadResults","Download Results")
  )
)

body <- dashboardBody(
  tabItems(
    tabItem(
      tabName = 'admin', class = 'active', 
        fluidRow(
          box(
            dataTableOutput('userTable'), width = 6
          )
        )
    )
  )
)


ui <- dashboardPage(title = 'admin function test', header, sidebar, body, skin='blue')

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

  dat <- data.frame(userName = c("John","Mary","Mike"), start = c("06/08/2019","01/01/2019","23/10/2019"), stringsAsFactors = FALSE)

  output$userTable <- renderDataTable({
    DT::datatable(isolate(dat),
                  editable = TRUE,
                  rownames = FALSE)
  })

  ###Tracking Changes###
  rvs <- reactiveValues(
    data = NA #dynamic data object
  )

  observe({
    rvs$data <- dat
  })

  proxy = dataTableProxy('userTable')
  observe({
    DT::replaceData(proxy, rvs$data, rownames = FALSE, resetPaging = FALSE)
  })

  observeEvent(input$userTable_cell_edit, {
    rvs$data <<- editData(rvs$data, input$userTable_cell_edit, rownames = FALSE)
  })

  # observeEvent(
  #   input$do,{
  #     write.csv(rvs$data,'userTest.csv', row.names = FALSE)
  #   })

  output$downloadResults <- downloadHandler(
    filename = function(){paste("userTest.csv.csv", sep = "")},
    content = function(file){write.csv(rvs$data, file, row.names = FALSE)}
  )

}

shinyApp(ui = ui, server = server)

如果您希望同时编辑多个单元格,请将此行添加到您的数据表中:

If you want multiple cells to be editable at the same time, add this line to your datatable:

editable = list(target = "all") #can be all, row, or column

以后发帖的几个小技巧:

Few tips when posting in the future:

  1. 创建一个可重现的示例,让它从您计算机上的文件中提取数据/保存数据无法重现
  2. 使代码尽可能简单,以专注于您的问题.将 renderUI 用于正文和侧边栏只会使您的代码变得混乱.
  1. Create a reproducible example, having it pull data/save data from a file on your computer can't be reproduced
  2. Keep the code simple as possible to focus on your issue. Throwing renderUI's for the body and sidebar just clutters your code.

这篇关于在闪亮的数据表中编辑多个单元格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆