我正在寻找一个简单的模块化设计的Shiny应用程序的帮助。我认为问题是名称空间问题,因此下面的示例被设置为我实际项目的简化版本。
目标是使tab_3
上的“ tabsetPanel
”仅在选中“ View Tab_3
”时显示,这很好。我想更新tabsetPanel
,但是在选中“ tab_3
”并且未按要求触发时也选择“ View Tab_3
”。
如果我将tabsetPanel的ID包装在名称空间函数tabsetPanel
中,则选中tab_3
时,我可以得到View Tab_3
也选择“ id = ns("tab_a_tha")
”,但是然后我失去了“ tab_3
”的显示/隐藏功能。
我的直觉是,解决方案在于为切换功能提供名称空间,但我没有找到任何方法的线索。
library(shiny)
library(shinyjs)
inner_moduleUI <- function(id){
ns <- NS(id)
tagList(
fluidRow(checkboxInput(ns("chckbx"), "View Tab_3", value = F)),
tabsetPanel(
id = "tab_a_tha",
# id = ns("tab_a_tha"),
tabPanel('tab_1'),
tabPanel('tab_2'),
tabPanel('tab_3')
)
)
}
inner_module <- function(input, output, session){
observeEvent(input$chckbx, {
toggle(condition = input$chckbx, selector = "#tab_a_tha li a[data-value=tab_3]")
if(input$chckbx == T){
updateTabsetPanel(session, 'tab_a_tha', selected = 'tab_3')
}
})
}
ui <- fluidPage(
useShinyjs(),
uiOutput('main_ui')
)
server <- function(input, output, session) {
output$main_ui <- renderUI({inner_moduleUI('inner_ns') })
callModule(inner_module, 'inner_ns')
}
shinyApp(ui = ui, server = server)
答案 0 :(得分:3)
您是对的,问题出在名称空间上。诀窍在于,您还可以使用session$ns
在模块的服务器部分中访问名称空间功能。
使用此方法并将抽头ID包裹在ns
函数中。我们可以使用paste0
来生成toggle
函数的新选择器。我们得到这样的东西:
library(shiny)
library(shinyjs)
inner_moduleUI <- function(id){
ns <- NS(id)
tagList(
fluidRow(checkboxInput(ns("chckbx"), "View Tab_3", value = F)),
tabsetPanel(
id = ns("tab_a_tha"),
# id = ns("tab_a_tha"),
tabPanel('tab_1'),
tabPanel('tab_2'),
tabPanel('tab_3')
)
)
}
inner_module <- function(input, output, session){
observeEvent(input$chckbx, {
toggle(condition = input$chckbx, selector = paste0("#",session$ns("tab_a_tha")," li a[data-value=tab_3]"))
if(input$chckbx == T){
updateTabsetPanel(session, 'tab_a_tha', selected = 'tab_3')
}
})
}
ui <- fluidPage(
useShinyjs(),
uiOutput('main_ui')
)
server <- function(input, output, session) {
output$main_ui <- renderUI({inner_moduleUI('inner_ns') })
callModule(inner_module, 'inner_ns')
}
shinyApp(ui = ui, server = server)