r - 如何将数据帧从observeEvent模块共享到另一个模块

标签 r dataframe module shiny reactive

我需要在一个observeEvent block 中与其他observeEvent block 共享多个数据帧。原因是因为只有在按下按钮后才会构建数据。

我发现以下两个问题非常机智,但与我的应用程序的结构不太接近......

How to return a variable from a module to the server in an R Shiny app?

How to access dataframe from another observeEvent?

我尝试将按钮observeEvent包装在模块内,但应用程序无法工作。我不知道如何将我的代码更改为模块以使其工作。

这是一个最小的示例。

library(shiny)
library(shinydashboard)
library(DT)

header1 <- dashboardHeader(
  title = "My App"
)

sidebar1 <- dashboardSidebar(
  sidebarMenu(id = "sbmenu",
              menuItemOutput("menuitems01"),
              menuItemOutput("menuitems02")
  ) #sidebarMenu
) #dashboardSidebar

body1 <- dashboardBody(
  tabItems(
    uiOutput("tabitems01")
  ) #tabItems
) #dashboardBody

ui <- dashboardPage(header1, sidebar1, body1)

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

  # render menu
  output$menuitems01 <- renderMenu({
    menuItem("Main", tabName = "main", icon = icon("key"))
  })

  # render tabitems
  output$tabitems01 <- renderUI({
    tabItem(tabName = "main",
            h2("Main"),
            actionButton(inputId = "btn1", label = "Button1")
    ) #tabItem
  }) #renderUI

  observeEvent(input$btn1, {
    dfresult02 <- data.frame(c(1, 2), c(3, 4)) # e.g. read some data from db
    dfresult05 <- data.frame(c(5, 6), c(7, 8)) # e.g. read some data from db
    rResult02 <- reactive({dfresult02}) # NEED TO MAKE THIS DATA AVAILABLE TO OTHER MODULE(S)
    rResult05 <- reactive({dfresult05}) # NEED TO MAKE THIS DATA AVAILABLE TO OTHER MODULE(S)
    output$menuitems02 <- renderMenu({
      menuItem("MyData", tabName = "mydata", icon = icon("th"))
    }) #renderMenu
    updateTabItems(session, "sbmenu", "mydata")
    print("button1 pressed")
  }) #observeEvent(input$btn1)

  observeEvent(input$sbmenu, {

    # IF I UNCOMMENT THE NEXT FOUR LINES, THE TABLES ARE DISPLAYED
    #dfresult02 <- data.frame(c(1, 2), c(3, 4))
    #rResult02 <- reactive({dfresult02})
    #dfresult05 <- data.frame(c(1, 2), c(3, 4))
    #rResult05 <- reactive({dfresult05})

    if(input$sbmenu == "mydata")
    {
      output$tabitems01 <- renderUI({
        tabItem(tabName = "mydata",
                h2("My Data"),
                DT::dataTableOutput('tbl02'),
                DT::dataTableOutput('tbl05')
        ) #tabItem
      }) #renderUI
      output$tbl02 <- DT::renderDataTable({rResult02()}) # NEED DATA FROM OTHER MODULE HERE
      output$tbl05 <- DT::renderDataTable({rResult05()}) # NEED DATA FROM OTHER MODULE HERE
    } #if(input$sbmenu == "mydata")

    if(input$sbmenu == "main")
    {
      output$tabitems01 <- renderUI({
        tabItem(tabName = "main",
                h2("Main"),
                actionButton(inputId = "btn1", label = "Button1")
        ) #tabItem
      }) #renderUI
    } #if(input$sbmenu == "main")

  }) #observeEvent(input$sbmenu)

} #server

shinyApp(ui = ui, server = server)

最佳答案

使用上面非常有用的注释,我最终得到了这段代码,它运行得很好!太感谢了!!! (注意reactiveValues的使用)

library(shiny)
library(shinydashboard)
library(DT)

header1 <- dashboardHeader(
  title = "My App"
)

sidebar1 <- dashboardSidebar(
  sidebarMenu(id = "sbmenu",
              menuItemOutput("menuitems01"),
              menuItemOutput("menuitems02")
  ) #sidebarMenu
) #dashboardSidebar

body1 <- dashboardBody(
  tabItems(
    uiOutput("tabitems01")
  ) #tabItems
) #dashboardBody

ui <- dashboardPage(header1, sidebar1, body1)

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

  # DECLARE REACTIVEVALUES FUNCTION HERE
  rResult <- reactiveValues(df02 = 0, df05 = 0)

  # render menu
  output$menuitems01 <- renderMenu({
    menuItem("Main", tabName = "main", icon = icon("key"))
  })

  # render tabitems
  output$tabitems01 <- renderUI({
    tabItem(tabName = "main",
            h2("Main"),
            actionButton(inputId = "btn1", label = "Button1")
    ) #tabItem
  }) #renderUI

  observeEvent(input$btn1, {
    dfresult02 <- data.frame(c(1, 2), c(3, 4)) # e.g. read some data from db
    dfresult05 <- data.frame(c(5, 6), c(7, 8)) # e.g. read some data from db
    rResult$df02 <- dfresult02 # MAKE THIS DATA AVAILABLE TO OTHER MODULE(S)
    rResult$df05 <- dfresult05 # MAKE THIS DATA AVAILABLE TO OTHER MODULE(S)
    output$menuitems02 <- renderMenu({
      menuItem("MyData", tabName = "mydata", icon = icon("th"))
    }) #renderMenu
    updateTabItems(session, "sbmenu", "mydata")
    print("button1 pressed")
  }) #observeEvent(input$btn1)

  observeEvent(input$sbmenu, {

    if(input$sbmenu == "mydata")
    {
      output$tabitems01 <- renderUI({
        tabItem(tabName = "mydata",
                h2("My Data"),
                DT::dataTableOutput('tbl02'),
                DT::dataTableOutput('tbl05')
        ) #tabItem
      }) #renderUI
      output$tbl02 <- DT::renderDataTable(rResult$df02) # GET DATA FROM OTHER MODULE(S) HERE
      output$tbl05 <- DT::renderDataTable(rResult$df05) # GET DATA FROM OTHER MODULE(S) HERE
    } #if(input$sbmenu == "mydata")

    if(input$sbmenu == "main")
    {
      output$tabitems01 <- renderUI({
        tabItem(tabName = "main",
                h2("Main"),
                actionButton(inputId = "btn1", label = "Button1")
        ) #tabItem
      }) #renderUI
    } #if(input$sbmenu == "main")

  }) #observeEvent(input$sbmenu)

} #server

shinyApp(ui = ui, server = server)

关于r - 如何将数据帧从observeEvent模块共享到另一个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55183583/

相关文章:

java - 英特尔lij : Module vs Directory

r - 使用键值对字典有选择地重命名 R 数据框列名

r - 将 coord_flip() 应用于单层

arrays - 与不同 ID 关联的查找和求和值

python - 如何修复Python中的 'ImportError: dynamic module does not define module export function (PyInit_cv2)'错误?

typescript - 如何从 1 个包中添加多个模块

r - 如何使用 geom_vline 和 geom_histogram r ggplot2 从填充比例图例中删除线

r - 更改 plot.dendrogram 中的叶子颜色,就像包 ape 的 plot.phylo

python - 使用 pandas DataFrame 重命名列值

python - Pandas DataFrame 按值和索引排序问题