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

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

问题描述

我早些时候问过这个问题-将可编辑的闪亮数据表写入.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天全站免登陆