r - 如何在带有模块的 navbarPage 中获取选定的 Tab-ID
问题描述
我想创建一个navbarPage
,其中每个tabPanel
或tagList
每个tabPanel
都是在另一个模块中创建的。
在“正常”闪亮的应用程序中,我将能够知道当前使用input$navbarPage_ID
. (分配的 id 变量在哪里navbarPage_ID
navbarPage
)
使用模块我无法获得正确的 ID,因为它不会改变。
如何在服务器模块中获取所选选项卡的正确 ID?
示例 1,其中tabPanels
在模块中创建:
library(shiny)
## Module 1 ####################
mod1_ui <- function(id, label, navid) {
ns <- NS(id)
tabPanel(label, value = navid,
h2("mod1")
)
}
mod1_server <- function(input, output, session, navid) {
observe({
message("mod1_server ", navid)
})
}
## Module 2 ####################
mod2_ui <- function(id, label, navid) {
ns <- NS(id)
tabPanel(label, value = navid,
h2("mod2")
)
}
mod2_server <- function(input, output, session, navid) {
observe({
message("mod2_server ", navid)
})
}
## Shiny App #####################
ui <- navbarPage(collapsible = T, id = "navbarid",
title = "Title",
mod1_ui("mod1", "Module 1 Tab", navid = 1),
mod2_ui("mod2", 'Module 2 Tab', navid = 2)
)
server <- function(input, output, session) {
callModule(mod1_server, "mod1", input$navbarid)
callModule(mod2_server, "mod2", input$navbarid)
}
shinyApp(ui, server)
示例 2,其中tabPanels
在 UI 中创建并且仅tagList
在模块中创建:
library(shiny)
## Module 1 ####################
mod1_ui <- function(id, label, navid) {
ns <- NS(id)
tagList(h2("mod1"))
}
mod1_server <- function(input, output, session, navid) {
observe({
message("mod1_server ", navid)
# message("mod1_server ", input$navbarid)
})
}
## Module 2 ####################
mod2_ui <- function(id, label, navid) {
ns <- NS(id)
tagList(h2("mod2"))
}
mod2_server <- function(input, output, session, navid) {
observe({
message("mod2_server ", navid)
# message("mod2_server ", input$navbarid)
})
}
## Shiny App #####################
ui <- navbarPage(collapsible = T, id = "navbarid",
title = "Title",
tabPanel("Module 1 Tab", value = 1,
mod1_ui("mod1")
),
tabPanel("Module 2 Tab", value = 2,
mod2_ui("mod2")
)
)
server <- function(input, output, session) {
callModule(mod1_server, "mod1", input$navbarid)
callModule(mod2_server, "mod2", input$navbarid)
}
shinyApp(ui, server)
解决方案
您在服务器中调用mod1_server
了两次;p
我将在父会话中使用这个技巧:
library(shiny)
## Module 1 ####################
mod1_ui <- function(id, label, navid) {
ns <- NS(id)
tabPanel(label, value = navid,
h2("mod1")
)
}
mod1_server <- function(input, output, session, parent_session) {
observe({
message("mod1_server ", parent_session$input$navbarid)
})
}
## Module 2 ####################
mod2_ui <- function(id, label, navid) {
ns <- NS(id)
tabPanel(label, value = navid,
h2("mod2")
)
}
mod2_server <- function(input, output, session, parent_session) {
observe({
message("mod2_server ", parent_session$input$navbarid)
})
}
## Shiny App #####################
ui <- navbarPage(collapsible = T, id = "navbarid",
title = "Title",
mod1_ui("mod1", "Module 1 Tab", navid = 1),
mod2_ui("mod2", 'Module 2 Tab', navid = 2)
)
server <- function(input, output, session) {
callModule(mod1_server, "mod1", parent_session = session)
callModule(mod2_server, "mod2", parent_session = session)
}
shinyApp(ui, server)
推荐阅读
- python - Python 请求 POST - 错误 400
- ios - Swift:实例成员不能用于 ARKitVision 示例中的类型
- java - 如何使用Java从特定日期减法
- javafx - 方法检查锁,在锁释放后运行
- powershell - powershell中的Unicode
- php - 尊重 Laravel 刀片中的换行符
- laravel - 由于外键无法更新记录
- java - Apache Beam 中的窗口数据每小时(顺时针)基础
- c++ - c ++ 11(MSVS2012)正则表达式在多行std :: string中查找文件名
- java - 使用 JeMalloc 查找 Java 应用程序中的本机内存泄漏