我使用
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)
您可以将两个面板包裹在一些
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)