在本主题中,很好地解释了输入一些密码后如何启动Shinyapp。我试图做同样的事情,但是我想有一个“ dashboardPage”而不是“ navbarPage”。
我试图将do.call函数形式’navbarPage’中的参数更改为’dashboardPage’,但应用程序崩溃。
rm(list = ls()) library(shiny) Logged = FALSE; my_username <- "test" my_password <- "test" ui1 <- function(){ tagList( div(id = "login", wellPanel(textInput("userName", "Username"), passwordInput("passwd", "Password"), br(),actionButton("Login", "Log in"))), tags$style(type="text/css", "#login {font-size:10px; text-align: left;position:absolute;top: 40%;left: 50%;margin-top: -100px;margin-left: -150px;}") )} ui2 <- function(){tagList(tabPanel("Test"))} ui = (htmlOutput("page")) server = (function(input, output,session) { USER <- reactiveValues(Logged = Logged) observe({ if (USER$Logged == FALSE) { if (!is.null(input$Login)) { if (input$Login > 0) { Username <- isolate(input$userName) Password <- isolate(input$passwd) Id.username <- which(my_username == Username) Id.password <- which(my_password == Password) if (length(Id.username) > 0 & length(Id.password) > 0) { if (Id.username == Id.password) { USER$Logged <- TRUE } } } } } }) observe({ if (USER$Logged == FALSE) { output$page <- renderUI({ div(class="outer",do.call(bootstrapPage,c("",ui1()))) }) } if (USER$Logged == TRUE) { output$page <- renderUI({ div(class="outer",do.call(dashboardPage,c(inverse=TRUE,title = "Contratulations you got in!",ui2()))) }) print(ui) } }) }) runApp(list(ui = ui, server = server))
如果我的代码足以使您从“正确的”道路上开始,我会感到好奇。如果不是这种情况,请告诉我。
如果登录名和密码正确,则下面的代码将显示一个闪亮的仪表板。
但需要解决以下问题:
observe
您可以尝试多种方法来解决上述问题。
但是请让我知道是否足够清楚。
这是代码:
rm(list = ls()) library(shiny) library(shinydashboard) Logged = FALSE my_username <- "test" my_password <- "test" ui1 <- function() { tagList( div( id = "login", wellPanel( textInput("userName", "Username"), passwordInput("passwd", "Password"), br(), actionButton("Login", "Log in") ) ), tags$style( type = "text/css", "#login {font-size:10px; text-align: left;position:absolute;top: 40%;left: 50%;margin-top: -100px;margin-left: -150px;}" ) ) } ui2 <- function() { tagList(dashboardHeader(), dashboardSidebar(), dashboardBody("Test")) } ui = (htmlOutput("page")) server = function(input, output, session) { USER <- reactiveValues(Logged = Logged) observe({ if (USER$Logged == FALSE) { if (!is.null(input$Login)) { if (length(input$Login) > 0) { Username <- isolate(input$userName) Password <- isolate(input$passwd) Id.username <- which(my_username == Username) Id.password <- which(my_password == Password) if (length(Id.username) > 0 & length(Id.password) > 0) { if (Id.username == Id.password) { USER$Logged <- TRUE } } } } } }) output$page <- renderUI({ if (USER$Logged == FALSE) { do.call(bootstrapPage, c("", ui1())) } else { do.call(dashboardPage, #c(inverse=TRUE,title = "Contratulations you got in!", ui2()) } }) } shinyApp(ui, server)
2017年10月30日更新
似乎上面的代码不再起作用(感谢@ 5249203指出这一点)。
我已经尝试修复它,但是我没有设法使该do.call函数正常工作dashboardBody (如果有人知道一种方法,请告诉我!)。
do.call
dashboardBody
因此,由于最近的shiny功能,我以另一种方式解决了这个问题。
shiny
看看您的想法(当然,像往常一样,解决方案只是需要扩展的模板)。
library(shiny) library(shinydashboard) Logged = FALSE my_username <- "test" my_password <- "test" ui <- dashboardPage(skin='blue', dashboardHeader( title = "Dashboard"), dashboardSidebar(), dashboardBody("Test", # actionButton("show", "Login"), verbatimTextOutput("dataInfo") ) ) server = function(input, output,session) { values <- reactiveValues(authenticated = FALSE) # Return the UI for a modal dialog with data selection input. If 'failed' # is TRUE, then display a message that the previous value was invalid. dataModal <- function(failed = FALSE) { modalDialog( textInput("username", "Username:"), passwordInput("password", "Password:"), footer = tagList( # modalButton("Cancel"), actionButton("ok", "OK") ) ) } # Show modal when button is clicked. # This `observe` is suspended only whith right user credential obs1 <- observe({ showModal(dataModal()) }) # When OK button is pressed, attempt to authenticate. If successful, # remove the modal. obs2 <- observe({ req(input$ok) isolate({ Username <- input$username Password <- input$password }) Id.username <- which(my_username == Username) Id.password <- which(my_password == Password) if (length(Id.username) > 0 & length(Id.password) > 0) { if (Id.username == Id.password) { Logged <<- TRUE values$authenticated <- TRUE obs1$suspend() removeModal() } else { values$authenticated <- FALSE } } }) output$dataInfo <- renderPrint({ if (values$authenticated) "OK!!!!!" else "You are NOT authenticated" }) } shinyApp(ui,server)