r-使用Shiny更新数据帧值,并在Shiny会话结束后在本地环境中访问它



我已经经历了大部分问答;关于Shiny中的数据帧操作,我仍然不知道如何做一些在我看来应该非常简单的事情。我没有编写Shiny应用程序的经验,而且我仍在与反应性事件等概念作斗争。

我有一个数据帧a,加载到R中。我希望能够在UI中的数据帧中的特定列中看到特定值,然后对其进行编辑。编辑数据帧后,我希望关闭Shiny应用程序,然后在RStudio的"环境"选项卡中看到编辑后的数据帧。我该怎么做?

我认为这可能是一个可行的例子。

假设df是您的数据帧(我使用iris进行测试,如下所述(。创建一个reactiveVal来保存您的数据,并用于使用datatable进行编辑。编辑后,可以使用<<-将数据存储回全局环境数据帧df中。另一种选择是在退出闪亮的应用程序时执行此操作(例如通过onStopsession$onSessionEnded方法(。

library(shiny)
library(DT)
#df <- iris
ui <- fluidPage(
DT::dataTableOutput('data'),
)
server <- function(input, output) {

rv <- reactiveVal(df)

output$data <- DT::renderDataTable ({
DT::datatable(rv(), editable = TRUE)
})

observeEvent(input$data_cell_edit, {
info <- input$data_cell_edit
newdf <- rv()
newdf[info$row, info$col] <- info$value
rv(newdf)
df <<- rv()
})

}
shinyApp(ui = ui, server = server)

替换退出时替换全局df(需要session(:

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

rv <- reactiveVal(df)

output$data <- DT::renderDataTable ({
DT::datatable(rv(), editable = TRUE)
})

observeEvent(input$data_cell_edit, {
info <- input$data_cell_edit
newdf <- rv()
newdf[info$row, info$col] <- info$value
rv(newdf)
})

session$onSessionEnded(function() {
df <<- isolate(rv())
})

}

如果你不想使用反应值,我想你可以尝试以下方法。这可以在进行编辑时在全局环境中更新您的data.frame。请注意,添加server = FALSE是为了处理页面中的更改:

server <- function(input, output) {

output$data <- DT::renderDT (df, editable = TRUE, server = FALSE)

observeEvent(input$data_cell_edit, {
info <- input$data_cell_edit
df[info$row, info$col] <<- info$value
})
}

最新更新