动态显示仪表板页面 [英] Dynamically display a dashboardPage

查看:0
本文介绍了动态显示仪表板页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个功能强大的闪亮应用,它使用shinydashboard包。

新功能需要特定于用户的行为(例如,对不同的用户名使用不同的数据集)。因此,我打算

  1. 显示登录表单
  2. 验证凭据,如果成功,则将反应值LoggedIn设置为true
  3. LoggedIn设置为TRUE后,立即显示实际的dashboardPage

我的方法基于this app,它根据反应值决定在renderUI中显示哪个元素。

以下简化示例用于在单击actionButton后更改显示的UI元素。源代码之间的唯一区别是,示例1(按预期工作)使用fixedPage,而示例2(不工作-单击按钮不会切换到ui2)使用dashboardPage

工作示例

library(shiny)

ui1 <- fixedPage(actionButton("btn_login", "Login"))
ui2 <- fixedPage(sliderInput("slider", "slider", 3, 2, 2))
ui <- uiOutput("ui")

server <- function(input, output, session) {
  state <- reactiveValues(LoggedIn = FALSE)
  output$ui <- renderUI({if (!state$LoggedIn) ui1 else ui2})

  observeEvent(input$btn_login, {
    state$LoggedIn = TRUE
  })
}

shinyApp(ui, server)

故障示例

library(shiny)
library(shinydashboard)

ui1 <- fixedPage(actionButton("btn_login", "Login"))
ui2 <- dashboardPage(dashboardHeader(), dashboardSidebar(), dashboardBody())
ui <- uiOutput("ui")

server <- function(input, output, session) {
  state <- reactiveValues(LoggedIn = FALSE)
  output$ui <- renderUI({if (!state$LoggedIn) ui1 else ui2})

  observeEvent(input$btn_login, {
    state$LoggedIn = TRUE
  })
}

shinyApp(ui, server)

这是由于shinydashboard包的特性吗? 除了this user,是否有人遇到过类似的问题并找到了解决方案?

提前感谢您的帮助!

编辑

@Sega这个相当无用的应用程序在reactiveTimer触发两次后呈现dashboardPage-也许有可能在没有计时器的情况下让它工作?

library(shiny)
library(shinydashboard)

ui1 <- fixedPage(actionButton("btn_login", "Login"))
ui2 <- dashboardPage(dashboardHeader(), dashboardSidebar(), dashboardBody())
ui <- uiOutput("ui")

server <- function(input, output, session) {
  state <- reactiveValues(LoggedIn = FALSE)
  timer <- reactiveTimer(1000, session)

  output$ui <- renderUI({if (!state$LoggedIn) ui1 else ui2})

  observeEvent(timer(), {
    state$LoggedIn = !state$LoggedIn
  })
}

shinyApp(ui, server)

编辑5月29日

@Bertil Baron

你的意思是这样的吗?

loginUI <- fixedPage(actionButton("btn_login", "Login"))
mainUI <- # See below
ui <- loginUI

server <- function(input, output, session) {
  observeEvent(input$btn_login, {
    removeUI(selector = "body")
    insertUI(selector = "head", where = "afterEnd", mainUI)
  })
}    
shinyApp(ui, server)

现在,如果mainUIbasicPage, bootstrapPage, fillPage, fixedPage, fluidPage, navbarPage之一-在DOM中插入并可见新的正文标记,则此操作有效,但对bootstrapPage无效。

如果您打算最初在dashboardBody中显示登录表单,并在成功登录后将其替换为实际内容-这是我想要避免的。

推荐答案

它也可以与invalidateLater()一起使用,但只能暂时使用。

library(shiny)
library(shinydashboard)

ui <- uiOutput("ui")

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

  state <- reactiveValues(LoggedIn = FALSE)

  observeEvent(input$btn_login, {
    state$LoggedIn = !state$LoggedIn
  })

  ui1 <- reactive({
    fixedPage(actionButton("btn_login", "Login"))
  })

  ui2 <- reactive({
    ui2 <- dashboardPage(dashboardHeader(), dashboardSidebar(), dashboardBody(
       sliderInput("slider", "slider", min = 1, max = 10, value = 2)
     ))
    invalidateLater(100, session)
    ui2
  })

  output$ui <- renderUI({if (!state$LoggedIn) ui1() else ui2()})

}

shinyApp(ui, server)

这篇关于动态显示仪表板页面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆