问题描述
我正在寻找一个简单的模块化设计的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,session) {
output$main_ui <- renderUI({inner_moduleUI('inner_ns') })
callModule(inner_module,'inner_ns')
}
shinyApp(ui = ui,server = server)
解决方法
您是对的,问题出在名称空间上。诀窍在于,您还可以使用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,session) {
output$main_ui <- renderUI({inner_moduleUI('inner_ns') })
callModule(inner_module,'inner_ns')
}
shinyApp(ui = ui,server = server)