我已经经历了大部分问答;关于Shiny中的数据帧操作,我仍然不知道如何做一些在我看来应该非常简单的事情。我没有编写Shiny应用程序的经验,而且我仍在与反应性事件等概念作斗争。
我有一个数据帧a,加载到R中。我希望能够在UI中的数据帧中的特定列中看到特定值,然后对其进行编辑。编辑数据帧后,我希望关闭Shiny应用程序,然后在RStudio的"环境"选项卡中看到编辑后的数据帧。我该怎么做?
我认为这可能是一个可行的例子。
假设df
是您的数据帧(我使用iris
进行测试,如下所述(。创建一个reactiveVal
来保存您的数据,并用于使用datatable
进行编辑。编辑后,可以使用<<-
将数据存储回全局环境数据帧df
中。另一种选择是在退出闪亮的应用程序时执行此操作(例如通过onStop
或session$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
})
}