如何使用DT包编辑和保存对Shiny数据表所做的更改

问题描述 投票:0回答:3

我想编辑表格并将更改保存到下面的示例中。这是我到目前为止所拥有的。

library(shiny)
library(DT)

Admit<-c("Admitted","Rejected","Admitted", "Rejected", "Admitted", "Rejected", "Admitted",
         "Rejected","Admitted", "Rejected", "Admitted","Rejected","Admitted", "Rejected","Admitted","Rejected", "Admitted", "Rejected",
         "Admitted","Rejected", "Admitted" ,"Rejected","Admitted", "Rejected")
Gender<-c("Male","Male","Female","Female", "Male",   "Male",   "Female", "Female", "Male","Male","Female","Female",
          "Male","Male","Female","Female","Male",   "Male",   "Female", "Female","Male","Male","Female","Female")
Dept<-c( "A","A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C", "D", "D", "D", "D", "E", "E", "E", "E", "F", "F", "F", "F")
Freq<-c("512", "313",  "89",  "19", "353", "207",  "17",   "8", "120", "205", "202", "391", "138", "279", "131", "244",  "53", "138",
        "94", "299",  "22", "351",  "24", "317")

banking.df<-data.frame(Admit,Gender,Dept, Freq)


# Define UI ----
ui <- fluidPage(
  titlePanel("UC Berkley Admissions"),

    mainPanel(
      tabsetPanel(
        id = 'dataset',
        tabPanel("Sample Bank", DT::dataTableOutput("banking.df"),
                 br(),
                 actionButton("saveBtn","Save")))))

# Define server logic ----
server <- function(input, output) {
  d1 = banking.df
  d1$Date = Sys.time() + seq_len(nrow(d1))

  output$banking.df=render_dt(d1,'cell')

  #edit a single cell
  proxy5=dataTableProxy('banking.df')
  observeEvent(input$banking.df_cell_edit,{
    info=input$banking.df_cell_edit
    str(info)
    d1<<-editData(d1,info)
    replaceData(proxy5,d1,resetPaging = FALSE)
  })

  #observeEvent(input$saveBtn,write.csv(input$banking.df),
  #             file="NewData.csv",row.names=FALSE)
}



# Run the app ----
shinyApp(ui = ui, server = server)

我可以编辑表格,它将存储更改。但是,每当我尝试对特定列进行新的编辑时,它都不会保存更改并将其保留为空白。例如,如果我在部门中输入“H”。不允许更改的列。我怎样才能解决这个问题? 另外,我如何使用“保存按钮”以便它可以覆盖banking.df? 谢谢你。

r shiny dt
3个回答
24
投票

我尝试了你的代码并修改了一些元素。有几点需要明确:

  • 您可以使用 DT 属性 editable=TRUE。
  • 要下载为csv或excel,您可以使用DT默认的CSV,Excel按钮。它可以存储编辑的数据。
  • 如果您想使用单独的按钮进行下载,您只需使用 write.csv() 即可。

代码: UI.R

library(shiny)
library(DT)

fluidPage(
  titlePanel("UC Berkley Admissions"),

  mainPanel(
    tabsetPanel(
      id = 'dataset',
      tabPanel("Sample Bank", 

               DT::dataTableOutput("banking.df_data"),
               br(),
               actionButton("viewBtn","View"),
               br(),
               actionButton("saveBtn","Save"),
               br(),
               DT::dataTableOutput("updated.df")
               ))))

服务器.R

Admit<-c("Admitted","Rejected","Admitted", "Rejected", "Admitted", "Rejected", "Admitted",
         "Rejected","Admitted", "Rejected", "Admitted","Rejected","Admitted", "Rejected","Admitted","Rejected", "Admitted", "Rejected",
         "Admitted","Rejected", "Admitted" ,"Rejected","Admitted", "Rejected")
Gender<-c("Male","Male","Female","Female", "Male",   "Male",   "Female", "Female", "Male","Male","Female","Female",
          "Male","Male","Female","Female","Male",   "Male",   "Female", "Female","Male","Male","Female","Female")
Dept<-c( "A","A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C", "D", "D", "D", "D", "E", "E", "E", "E", "F", "F", "F", "F")
Freq<-c("512", "313",  "89",  "19", "353", "207",  "17",   "8", "120", "205", "202", "391", "138", "279", "131", "244",  "53", "138",
        "94", "299",  "22", "351",  "24", "317")

banking.df<-data.frame(Admit,Gender,Dept, Freq,stringsAsFactors = FALSE)
d1 = banking.df
d1$Date = Sys.time() + seq_len(nrow(d1))

function(input, output) {


  output$banking.df_data<-renderDataTable(
    d1,selection = 'none', editable = TRUE, 
    rownames = TRUE,
    extensions = 'Buttons',

    options = list(
      paging = TRUE,
      searching = TRUE,
      fixedColumns = TRUE,
      autoWidth = TRUE,
      ordering = TRUE,
      dom = 'Bfrtip',
      buttons = c('csv', 'excel')
    ),

    class = "display"
  )


  observeEvent(input$banking.df_data_cell_edit, {
    d1[input$banking.df_data_cell_edit$row,input$banking.df_data_cell_edit$col] <<- input$banking.df_data_cell_edit$value
  })

 view_fun<-eventReactive(input$viewBtn,{
    if(is.null(input$saveBtn)||input$saveBtn==0)
    {
      returnValue()
    }
    else
    {
     DT::datatable(d1,selection = 'none')
    }

  })


  observeEvent(input$saveBtn,{
    write.csv(d1,'test.csv')
  })

  output$updated.df<-renderDataTable({
    view_fun()
  }
  )
}

希望这有帮助。


0
投票

对 Subhasish1315 令人惊叹的代码只有一个小评论:它对我来说只需一个小修正即可工作。显然 DT 从 0 开始列号,而 R 从 1 开始,所以应该是:

observeEvent(input$banking.df_data_cell_edit, {
    d1[input$banking.df_data_cell_edit$row,input$banking.df_data_cell_edit$col**+1**] <<- input$banking.df_data_cell_edit$value
  })

有关该问题的讨论,请参阅Shiny DT 编辑保存在错误的列中。


0
投票
请帮忙。我对此有一个后续问题。如果表数据集“d1”是反应式数据框怎么办?那么我怎样才能保存对数据表的编辑呢?我这几天一直在努力寻找解决方案。

为了进一步澄清,假设我要求用户输入性别选择(男性或女性),然后我根据该反应性输入创建输出 tab1 数据表,并且仍然希望能够编辑并将更改保存到该数据表。我该怎么做呢?请参阅下面的示例代码。

ui <- fluidPage( selectInput("gender", label = "Select Gender", c("Male", "Female"), selected = "Male"), br(), DTOutput("tab1"), br(), actionButton("saveBtn", "Save changes"), br(), DTOutput("tab2") ) server=function(input, output) { dat1 <- reactive({ d1 %>% filter(Gender %in% input$gender) }) output$tab1<-renderDataTable(dat1, editable = TRUE) observeEvent(input$tab1_cell_edit, { str(input$tab1_cell_edit) row <- input$tab1_cell_edit$row col <- input$tab1_cell_edit$col value <- input$tab1_cell_edit$value dat1()[row,col] <<- value }) save_fun<-eventReactive(input$saveBtn,{ dat1() }) output$tab2 <- renderDT({ datatable(dat1(), caption="After Saved Edits")}) }
    
© www.soinside.com 2019 - 2024. All rights reserved.