Проблема с блестящим пространством имен при переключении и tabsetPanel

#r #shiny #namespaces #toggle #shinyjs

#r #блестящий #пространства имен #переключение #shinyjs

Вопрос:

Я ищу помощи с простым блестящим приложением с модульным дизайном, пожалуйста. Я думаю, что проблема заключается в проблеме с пространством имен, поэтому приведенный ниже пример представлен как упрощенная версия моего фактического проекта.

Цель состоит в том, чтобы ‘ tab_3 ’ на tabsetPanel отображался только тогда, когда ‘ View Tab_3 ’ установлен флажок, что отлично работает. Я хотел бы, tabsetPanel однако, обновить, чтобы также выбирать ‘ tab_3 ’, когда ‘ View Tab_3 ’ установлен флажок, и это срабатывает не так, как хотелось бы.

Я могу заставить tabsetPanel также выбирать ‘ tab_3 ’, когда ‘ View Tab_3 ’ установлен флажок, если я переношу идентификатор tabsetPanel в функцию пространства имен, 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)
  

Комментарии:

1. Возможно, изменение putput на output в определении inner_module могло бы решить вашу проблему.

2. Спасибо за исправленную опечатку (исправлено сейчас)… однако это не возымело никакого эффекта.

Ответ №1:

вы правы, проблема в пространстве имен. Хитрость в том, что вы можете получить доступ к функции пространства имен также в серверной части модуля с session$ns .

Используя это и перенося идентификатор касания в 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)
  

Комментарии:

1. Это было именно то, что я искал — большое спасибо @Bertil.