#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.