R:保存来自多个面板的数据帧

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

在下面的应用程序中,我想添加一个全局按钮,以同时将表格保存在两个面板中。 理想情况下,应该将它们保存到xlsx文件中,保存在以相应选项卡命名的选项卡中。 请注意,这些选项卡是使用模块创建的

非常感谢

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)

谢谢你!它很有魅力,我可以很容易地把它改编成我的完整剧本。