仅在单击菜单项时加载闪亮的模块

Kon*_*rad 4 r shiny shinydashboard shiny-reactivity

背景

在模块化1 Shiny 应用程序中,我想仅在单击上的菜单项时加载模块。如果未访问菜单项,我不想加载模块。

基本应用

app.R

# Libs
library(shiny)
library(shinydashboard)

# Source module
source("sample_module.R")

ui <- dashboardPage(
    dashboardHeader(title = "Dynamic sidebar"),
    dashboardSidebar(sidebarMenuOutput("menu")),
    dashboardBody(tabItems(
        tabItem(tabName = "tab_one", h1("Tab One")),
        tabItem(tabName = "tab_two", sampleModuleUI("sampleModule"))
    ))
)

server <- function(input, output) {

    callModule(sampleModuleServer, "sampleModule")

    output$menu <- renderMenu({
        sidebarMenu(
            menuItem(
                "Menu item 1",
                icon = icon("calendar"),
                tabName = "tab_one"
            ),
            menuItem(
                "Menu item 2",
                icon = icon("globe"),
                tabName = "tab_two"
            )
        )
    })
}

shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)

sample_module.R

sampleModuleServer <- function(input, output, session) {
    output$plot1 <- renderPlot({
        plot(mtcars)
    })
}

sampleModuleUI <- function(id) {
    ns <- NS(id)

    plotOutput(ns("plot1"))

}
Run Code Online (Sandbox Code Playgroud)

期望的实现

sample_module只有在单击相关菜单项时才会加载所需的实现。在第2行:

不要从observeEvent内部调用callModule;保持在最高水平。获取返回的响应式表达式,并使用 eventReactive 将其包装在按钮单击中。并使用您的输出等中的 eventReactive。

x <- callModule(...)
y <- eventReactive(input$go, x())
output$tbl <- DT::renderDataTable(y())
Run Code Online (Sandbox Code Playgroud)

试图

app.R (修改的)

# Libs
library(shiny)
library(shinydashboard)

# Source module
source("sample_module.R")

ui <- dashboardPage(
    dashboardHeader(title = "Dynamic sidebar"),
    dashboardSidebar(sidebarMenuOutput("menu")),
    dashboardBody(tabItems(
        tabItem(tabName = "tab_one", h1("Tab One")),
        tabItem(tabName = "tab_two", sampleModuleUI("sampleModule"))
    ))
)

server <- function(input, output) {

    eventReactive(eventExpr = input$tab_two,
                  valueExpr = callModule(sampleModuleServer, "sampleModule")
    )

    output$menu <- renderMenu({
        sidebarMenu(
            menuItem(
                "Menu item 1",
                icon = icon("calendar"),
                tabName = "tab_one"
            ),
            menuItem(
                "Menu item 2",
                icon = icon("globe"),
                tabName = "tab_two"
            )
        )
    })
}

shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)

问题

应用程序运行但模块未加载。问题:

  • 如何正确调用eventReactive仪表板菜单项?在tab_item似乎不具有id参数是tabName在这方面等同?
  • 链接的讨论是指刷新一张表。我试图找出可以与包含大量界面元素和精心设计的服务器调用的模块一起使用的示例。

单击菜单项 2应显示sample_module.R文件中的内容。

应用布局


1 模块化 Shiny 应用程序代码

2 个 Google 群组:使用 actionButton 激活模块


更新

我已经尝试使用以下语法显式强制模块进入应用程序环境加载:

eventReactive(eventExpr = input$tab_two,
              valueExpr = callModule(sampleModuleServer, "sampleModule"),
              domain = MainAppDomain
)
Run Code Online (Sandbox Code Playgroud)

在哪里

MainAppDomain <- getDefaultReactiveDomain()
Run Code Online (Sandbox Code Playgroud)

ism*_*gal 9

编辑:删除 Joe Cheng 的顶级声明:

# Libs
library(shiny)
library(shinydashboard)

# Source module
source("sample_module.R")

ui <- dashboardPage(
  dashboardHeader(title = "Dynamic sidebar"),
  dashboardSidebar(sidebarMenuOutput("menu")),
  dashboardBody(tabItems(
    tabItem(tabName = "tab_one", h1("Tab One")),
    tabItem(tabName = "tab_two", sampleModuleUI("sampleModule"))
  ))
)

server <- function(input, output) {

  observeEvent(input$tabs,{
    if(input$tabs=="tab_two"){
      callModule(sampleModuleServer, "sampleModule")
    }
  }, ignoreNULL = TRUE, ignoreInit = TRUE)

  output$menu <- renderMenu({
    sidebarMenu(id = "tabs",
                menuItem(
                  "Menu item 1",
                  icon = icon("calendar"),
                  tabName = "tab_one"
                ),
                menuItem(
                  "Menu item 2",
                  icon = icon("globe"),
                  tabName = "tab_two"
                )
    )
  })
}

shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)

此外,您sidebarMenu需要一个 id 来访问选定的选项卡;请参阅 Shinydashboard文档