切换和 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)