如何在shinyauthr认证之前停止出现侧边栏?

问题描述 投票:0回答:1

我使用

shinyauthr
作为
shiny
应用程序的登录名。但是,即使在身份验证之前(图像的左下角),我也会看到一个小的灰色矩形,侧边栏将出现在其中。

如何让侧边栏仅在身份验证后才出现?这是一个简单的应用程序来演示:

library(shiny)
library(shinyauthr)

user_base <- tibble::tibble(
  user = c("user1"),
  password = c("pass1"),
  permissions = c("admin"),
  name = c("User One")
)

ui <- fluidPage(
  div(class = "pull-right", shinyauthr::logoutUI(id = "logout")),
  shinyauthr::loginUI(id = "login"),
  sidebarLayout(
    sidebarPanel(uiOutput("sidebarpanel")),
    mainPanel(uiOutput("mainpanel"))
  )
)

server <- function(input, output, session) {
  
  credentials <- shinyauthr::loginServer(
    id = "login",
    data = user_base,
    user_col = user,
    pwd_col = password,
    log_out = reactive(logout_init())
  )
  
  logout_init <- shinyauthr::logoutServer(
    id = "logout",
    active = reactive(credentials()$user_auth)
  )
  
  output$sidebarpanel <- renderUI({
    req(credentials()$user_auth)
    tagList(
      numericInput("flank",
                   "Flank (bp)",
                   value = 110, min = 0, max = NA),
      numericInput("correction",
                   "Correction (repeats)",
                   value = 0, min = 0, max = NA)
    )
  })
  
  output$mainpanel <- renderTable({
    req(credentials()$user_auth)
    data.frame("Flank" = input$flank,
               "Correction" = input$correction)
  })
 
}
    
shinyApp(ui = ui, server = server)
r authentication shiny sidebar
1个回答
0
投票

您可以将两个面板包裹在一些

div
中并为其分配 id:

sidebarLayout(
    div(id = "sidebarPanel", sidebarPanel(uiOutput("sidebarpanel"))),
    div(id = "mainPanel", mainPanel(uiOutput("mainpanel")))
)

然后使用包含

observe
shinyjs::toggle
,具体取决于
user_auth
:

observe({
    shinyjs::toggle(id = "sidebarPanel", condition = credentials()$user_auth)
    shinyjs::toggle(id = "mainPanel", condition = credentials()$user_auth)
})

这是一个完整的示例。

library(shiny)
library(shinyauthr)
library(shinyjs)

user_base <- tibble::tibble(
    user = c("user1"),
    password = c("pass1"),
    permissions = c("admin"),
    name = c("User One")
)

ui <- fluidPage(
    shinyjs::useShinyjs(),
    div(class = "pull-right", shinyauthr::logoutUI(id = "logout")),
    shinyauthr::loginUI(id = "login"),
    sidebarLayout(
        div(id = "sidebarPanel", sidebarPanel(uiOutput("sidebarpanel"))),
        div(id = "mainPanel", mainPanel(uiOutput("mainpanel")))
    )
)

server <- function(input, output, session) {
    
    credentials <- shinyauthr::loginServer(
        id = "login",
        data = user_base,
        user_col = user,
        pwd_col = password,
        log_out = reactive(logout_init())
    )
    
    logout_init <- shinyauthr::logoutServer(
        id = "logout",
        active = reactive(credentials()$user_auth)
    )
    
    observe({
        shinyjs::toggle(id = "sidebarPanel", condition = credentials()$user_auth)
        shinyjs::toggle(id = "mainPanel", condition = credentials()$user_auth)
    })
    
    output$sidebarpanel <- renderUI({
        req(credentials()$user_auth)
        tagList(
            numericInput("flank",
                         "Flank (bp)",
                         value = 110, min = 0, max = NA),
            numericInput("correction",
                         "Correction (repeats)",
                         value = 0, min = 0, max = NA)
        )
    })
    
    output$mainpanel <- renderTable({
        req(credentials()$user_auth)
        data.frame("Flank" = input$flank,
                   "Correction" = input$correction)
    })
    
}

shinyApp(ui = ui, server = server)
© www.soinside.com 2019 - 2024. All rights reserved.