动态显示仪表板页面 [英] Dynamically display a dashboardPage
本文介绍了动态显示仪表板页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个功能强大的闪亮应用,它使用shinydashboard
包。
新功能需要特定于用户的行为(例如,对不同的用户名使用不同的数据集)。因此,我打算
- 显示登录表单
- 验证凭据,如果成功,则将反应值
LoggedIn
设置为true
- 将
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)
现在,如果mainUI
是basicPage, 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屋!
查看全文