R:保存来自多个面板的数据帧
在下面的应用程序中,我想添加一个全局按钮,以同时将表格保存在两个面板中。 理想情况下,应该将它们保存到xlsx文件中,保存在以相应选项卡命名的选项卡中。 请注意,这些选项卡是使用模块创建的 非常感谢R:保存来自多个面板的数据帧,r,shiny,R,Shiny,在下面的应用程序中,我想添加一个全局按钮,以同时将表格保存在两个面板中。 理想情况下,应该将它们保存到xlsx文件中,保存在以相应选项卡命名的选项卡中。 请注意,这些选项卡是使用模块创建的 非常感谢 library(shiny) library(DT) modDtUi <- function(id){ # UI module ns = NS(id) DT::dataTableOutput(ns('x1')) } modDt <- function(input, out
library(shiny)
library(DT)
modDtUi <- function(id){ # UI module
ns = NS(id)
DT::dataTableOutput(ns('x1'))
}
modDt <- function(input, output, session, data, globalSession){ # Server module
x <- data
output$x1 <- DT::renderDataTable(x, selection = 'none', editable = TRUE)
proxy <- dataTableProxy('x1', session = globalSession)
}
ui <- fluidPage(
mainPanel(
tabsetPanel(
tabPanel("Table1", modDtUi("editable")),
tabPanel("Table2", modDtUi("editable2"))
)
)
)
server <- function(input, output, session) {
callModule(modDt,"editable", data = head(iris,10), globalSession = session)
callModule(modDt,"editable2", data = tail(iris,5), globalSession = session)
}
shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(DT)
modDtUi我相信这个演示是有效的
我使用reactiveValues
v$data
将数据存储在模块中。该模块将返回
v$data
,以便在您希望将数据保存到服务器
中时可以检索该模块
我还添加了一个observeEvent
来检测数据中的更改,并使用replaceData
更新数据表
excel文件是使用writexl
库创建的,当然您可以用其他库替换
让我知道这是否适合你。我想这个答案中有一些可以改进的元素——如果我们能够确定它们,我想进一步编辑
library(shiny)
library(DT)
library(writexl)
modDtUi <- function(id){ # UI module
ns = NS(id)
DT::dataTableOutput(ns(id))
}
modDt <- function(input, output, session, data, id, globalSession){ # Server module
v <- reactiveValues(data = data)
output[[id]] <- DT::renderDataTable(v$data, selection = 'none', editable = TRUE)
proxy <- dataTableProxy(id, session = globalSession)
id_input = paste(id, "cell_edit", sep = "_")
# Could add observeEvent here to detect edit event
observeEvent(input[[id_input]], {
info = input[[id_input]]
if (!is.null(info)) {
v$data[info$row, info$col] <<- DT::coerceValue(info$value, v$data[info$row, info$col])
}
replaceData(proxy, v$data, resetPaging = FALSE)
})
return(data = reactive({v$data}))
}
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
width = 2,
actionButton("btn", "Save Both")
),
mainPanel(
tabsetPanel(
tabPanel("Table1", modDtUi("editable1")),
tabPanel("Table2", modDtUi("editable2"))
)
)
)
)
server <- function(input, output, session) {
e1 <- callModule(modDt, "editable1", data = head(iris,10), id = "editable1", globalSession = session)
e2 <- callModule(modDt, "editable2", data = tail(iris,5), id = "editable2", globalSession = session)
observeEvent(input$btn, {
print("Saving...")
sheets <- list("e1" = e1(), "e2" = e2())
write_xlsx(sheets, "test.xlsx")
})
}
shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(DT)
图书馆(writexl)
谢谢你!它很有魅力,我可以很容易地把它改编成我的完整剧本。