输入密码后启动Shiny应用程序(使用Shinydashboard)

在本主题中,很好地解释了输入一些密码后如何启动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))

回答:

如果我的代码足以使您从“正确的”道路上开始,我会感到好奇。如果不是这种情况,请告诉我。

如果登录名和密码正确,则下面的代码将显示一个闪亮的仪表板。

但需要解决以下问题:

  • CSS中有问题。我认为您需要将登录操作更改的CSS重置为Shinydashboard的更标准配置(当前为全白色)
  • 如果密码错误,则第一个密码observe将继续在renderUI上“赢得”(带有或没有第二个密码observe,严格来说是不必要的,因此消除了),并且永远不会执行与错误登录有关的消息。

您可以尝试多种方法来解决上述问题。

  • 对于CSS,您可以重新设置它,也可以在模式中优雅地登录。
  • 对于第二个,也许您可​​以将所有逻辑带入renderUI调用。这样可以确保所有情况都已执行。

但是请让我知道是否足够清楚。

这是代码:

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)

似乎上面的代码不再起作用(感谢@ 5249203指出这一点)。

我已经尝试修复它,但是我没有设法使该do.call函数正常工作dashboardBody (如果有人知道一种方法,请告诉我!)。

因此,由于最近的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)

以上是 输入密码后启动Shiny应用程序(使用Shinydashboard) 的全部内容, 来源链接: utcz.com/qa/428836.html

回到顶部