我正在使用shinyauthr作为shiny应用程序的登录.然而,我得到了一个小的灰色矩形,在那里侧边栏将出现,甚至在身份验证之前(图像的左下角).

enter image description here

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

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")))
)

然后使用包含shinyjs::toggleobserve,具体取决于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)

R相关问答推荐

R:将列名的字符载体传递给可以 Select 接受多个参数的函数

如何删除字符串中重复的字符序列?

R中的滞后累积量

编码变量a、b、c以匹配来自另一个数据点的变量x

即使硬币没有被抛出,也要保持对其的跟踪

使用R中的正则表达式将一列分割为多列

将重复项转换为NA

如何用书面利率绘制geom_bar图

列名具有特殊字符时的循环回归

R:如果为NA,则根据条件,使用列名模式将缺少的值替换为另一列中的值

使用geom_iles在一个切片中包含多个值

如何将这个小列表转换为数据帧?

为R中的16组参数生成10000个样本的有效方法是什么?

按组和连续id计算日期差

R预测包如何处理ARIMA(Auto.arima函数)中的缺失值

如何移动点以使它们的打印不重叠

填充图例什么时候会有点?

如何合并不同列表中的数据文件,包括基于名称的部分匹配,而不是一对一等价

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)

在鼠标悬停时使用Plotly更改geom_point大小