切换和 tabsetPanel 的闪亮命名空间问题
Shiny namespace issue with toggle and tabsetPanel
我正在寻求一些关于具有模块化设计的简单 Shiny 应用程序的帮助。我认为问题是名称 space 问题,因此下面的示例是我实际项目的简化版本。
目的是让 tabsetPanel
上的“tab_3
”仅在选中“View Tab_3
”时显示,效果很好。我想将 tabsetPanel
更新为也 select ‘tab_3
’ 当‘View Tab_3
’被选中并且这没有按预期触发时。
如果我将 tabsetPanel 的 id 包装在名称中 space 函数,id = ns("tab_a_tha")
,但是我失去了 'tab_3
' 的 show/hide 功能。
我的直觉是,解决方案在于为切换功能提供一个名称space,但我还没有找到任何关于如何处理它的线索。
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)
你是对的,问题出在命名空间上。诀窍是您也可以在模块的服务器部分使用 session$ns
.
访问命名空间函数
使用它并在 ns
函数中包装 tap id。我们可以使用 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)
我正在寻求一些关于具有模块化设计的简单 Shiny 应用程序的帮助。我认为问题是名称 space 问题,因此下面的示例是我实际项目的简化版本。
目的是让 tabsetPanel
上的“tab_3
”仅在选中“View Tab_3
”时显示,效果很好。我想将 tabsetPanel
更新为也 select ‘tab_3
’ 当‘View Tab_3
’被选中并且这没有按预期触发时。
如果我将 tabsetPanel 的 id 包装在名称中 space 函数,id = ns("tab_a_tha")
,但是我失去了 'tab_3
' 的 show/hide 功能。
我的直觉是,解决方案在于为切换功能提供一个名称space,但我还没有找到任何关于如何处理它的线索。
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)
你是对的,问题出在命名空间上。诀窍是您也可以在模块的服务器部分使用 session$ns
.
使用它并在 ns
函数中包装 tap id。我们可以使用 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)