如何在Shiny应用中实现R.Data文件的数据保存与加载功能
Shiny可编辑DT表格数据持久化问题
我正在创建绑定observe()的DT表格,用户填写表格时数值可实时更新,效果如下:
我的需求是点击Do Save Data 按钮时,将更新后的数据保存到.RData文件中,关闭Shiny应用后再次打开可恢复之前输入的所有信息。
目前遇到的问题是无法正确加载已保存的数据,相关界面如下:

以下是初始脚本代码:
library(shiny) library(shinyjs) library(shinydashboard) library(DT) library(readr) library(dplyr) library(data.table) ui <- dashboardPage( dashboardHeader(title = "Test dashboard"), dashboardSidebar(uiOutput("sidebarpanel")), dashboardBody(shinyjs::useShinyjs(), uiOutput("body")) ) server <- function(input, output) { output$sidebarpanel <- renderUI({ sidebarMenu( menuItem("test2", tabName = "T2", icon = icon("th")), actionButton("doSave", "Do Save Data"), actionButton("doLoad", "Do Load Data") ) }) output$body <- renderUI({ tabItems( tabItem(tabName ="T2", class = "active", fluidRow( box(width = 12, title = "DT Result", status = "warning", solidHeader = TRUE, collapsible = TRUE, splitLayout( box(width = 12, title = "Content A", status = "warning", solidHeader = TRUE, collapsible = TRUE, dataTableOutput('content_SC_RSR')))) ))) }) ##################################### TABLE RESULT 1 ################################################## vc <- 'value' SC_RSR <- reactiveValues(data=NULL) data_SC_RSR = data.frame( KSF = c('A', 'B', 'C'), SCORE = c(NA, NA, NA) ) SC_RSR_Data <- reactive ({ data_SC_RSR }) observe({ SC_RSR$data <- SC_RSR_Data() }) output$content_SC_RSR <- DT::renderDataTable({ SC_RSR$data %>% datatable(editable = list(target = "cell", disable = list(columns = c(0,1))), options = list(paging = FALSE, searching = FALSE)) }) observeEvent(input$content_SC_RSR_cell_edit, { info = input$content_SC_RSR_cell_edit str(info) i = info$row j = info$col v = as.numeric(info$value) SC_RSR$data[i, j] <<- DT::coerceValue(v, SC_RSR$data$data[i, j]) }) # 初始保存数据逻辑 observeEvent(input$doSave, { save(SC_RSR, file = "data.RData") Save_done <- showNotification(paste("Message", "Data Has been saved"), duration = NULL) }) # 初始加载数据逻辑 observeEvent(input$doLoad, { SC_RSR <- load("data.RData") Load_done <- showNotification(paste("Message", "Data Has been loaded"), duration = NULL) }) } shinyApp(ui, server)
已验证解决方案
修改保存和加载逻辑的对应代码即可修复问题:
# 保存数据逻辑 observeEvent(input$doSave, { savedata <<- SC_RSR$data save(savedata, file = "data.RData") Save_done <- showNotification(paste("提示", "数据已保存"), duration = NULL) }) # 加载数据逻辑 observeEvent(input$doLoad, { load("data.RData") SC_RSR$data <- savedata Load_done <- showNotification(paste("提示", "数据已加载"), duration = NULL) })
内容的提问来源于stack exchange,提问作者Reza AM
相关产品推荐
相关产品推荐

