Как скрыть navbarMenus с помощьюshiningjs?

Этот вопрос связан с комбинацией navbarMenus и пакета Shinyjs. Я создал блестящее приложение, а также добавил логин пользователя, следуя этому предложению: https://gist.github.com/withr/9001831.

Итак, я знаю, какой пользователь вошел в систему. Теперь я хотел бы показать и скрыть как целое navbarMenu, так и отдельные вкладки, в зависимости от того, какой пользователь вошел в систему. Допустим, есть два пользователя: «admin» и «custom». , а для «admin» должны отображаться все navbarMenus и все tabPanels, в то время как «custom» получает только navbarMenu 2 и в этом меню только tabPanel 22 для просмотра.

library(shiny)
library(shinyjs)

# Define UI
ui <-
fluidPage(
titlePanel("NAVBARPAGE"), # title
br(),
################### NAVBAR  ############################
navbarPage(
"", # title
################### TABS THEMA  #######################
hidden(div(id='m1',
navbarMenu("Menu1",
tabPanel('tab11',plotOutput('tab_11')),
tabPanel('tab12',uiOutput('tab_12'))))),
navbarMenu("Menu2",
tabPanel('tab21',uiOutput('tab_21')),
hidden(div(id='xxx',tabPanel('tab22',uiOutput('tab_22')))))
#######################################################
))

###### SERVER #####
server <- function(input, output,session) {
#Define user
user<-'admin'

observe({
if (user=='admin') {
show('xxx')
show('m1')
}
else {
hide('xxx')
hide(m1)
}
})
# Run the application
shinyApp(ui = ui, server = server)

В этом минимальном примере tabPanel ('tab22') скрыт, но не отображается, когда я определяю

user<-'custom'

Плюс странный внешний вид первого navbarMenu 'm1' - он на самом деле не скрыт, он только пустой. Кто-нибудь знает помогите?


person thmschk    schedule 05.09.2017    source источник


Ответы (1)


В вашем коде есть некоторые ошибки: отсутствует } в конце вашей функции server, вызывается функция hide с m1 вместо "m1", и не инициализируется shinyjs с shinyjs::useShinyjs(). Кроме того, вы не можете использовать div рядом с navbarMenu или tabPanel, они не будут отображаться. Наконец, любому пользователю было бы очень легко показать/скрыть контент.

Лучший вариант — создать navbar в соответствии с пользователем, используя uiOutput, и контролировать, что отображать, используя имя пользователя. Ниже приведен пример, основанный на вашем коде, для отображения контента на основе пользователей.

library(shiny)
library(shinyjs)
ui <- fluidPage(
  selectInput("userSL", 'Users:', c('admin', 'custom')),
  titlePanel("NAVBARPAGE"), 
  br(),
  uiOutput("navbarPageUI")
)

server <- function(input, output,session) {

  output$navbarPageUI <- renderUI({
    user <- input$userSL
    if (user == 'admin') {
      navbarPage("", 
        navbarMenu("Menu1",
          tabPanel('tab11',plotOutput('tab_11')),
          tabPanel('tab12',uiOutput('tab_12'))
        ),
        navbarMenu("Menu2",
          tabPanel('tab21',uiOutput('tab_21')),
          tabPanel('tab22',uiOutput('tab_22'))
        )
      )
    } else {
      navbarPage("", 
        navbarMenu("Menu2",
          tabPanel('tab21',uiOutput('tab_21'))
        )
      )
    }
  })

}

shinyApp(ui = ui, server = server)
person Geovany    schedule 05.09.2017
comment
Спасибо, Джовани, это очень помогло. Еще один вопрос: вы упомянули, что любому пользователю будет легко показать любой скрытый контент. Можете ли вы объяснить, почему? Спасибо. - person thmschk; 07.09.2017
comment
Я столкнулся с этим вопросом здесь, когда искал похожее решение. Этот ответ немного груб, поскольку он использует renderUI для создания пользовательского интерфейса изнутри сервера - это очень неэффективно и не рекомендуется (например, menu2 нужно создавать дважды). Вместо этого рассмотрите возможность использования следующего: https://github.com/daattali/shinyjs/issues/43< /а>. - person Adi Sarid; 17.02.2019