当前位置: 首页 > 面试题库 >

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

万乐逸
2023-03-14
问题内容

在本主题中,很好地解释了输入一些密码后如何启动Shinyapp。我试图做同样的事情,但是我想有一个“
dashboardPage”而不是“ navbarPage”。

我试图将do.call函数形式’navbarPage’中的html" target="_blank">参数更改为’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)

2017年10月30日更新

似乎上面的代码不再起作用(感谢@ 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)


 类似资料:
  • 问题内容: 我的目标是让我的Flask应用程序启动后运行任意代码。这是我所拥有的: 理想情况下,我将能够做到这一点: 但是代码不会继续过去,因此永远不会运行。 我目前正在解决的解决方案是在与分开的线程中运行,创建一个设置此功能的函数: 然后获取)来向应用发出基本请求,以便运行“先请求之前”代码。这相当复杂,难以记录。我宁愿使用Flask中已经提供的参数,也可以使用装饰器,但据我所知,这两个都不存在

  • 在kubuntu上用存储的密码启动pgAdmin III,每次连接到数据库时都会要求输入密码,并给出错误“连接到服务器的错误:fe_sendauth:没有提供密码”。它忽略存储密码字段中的复选框。

  • 由:org.springframework.beans.factory.beanCreationException引起:创建名为“Meta DataSourceAdvisor”的bean时出错:在设置构造函数参数时无法解析对bean“Method SecurityMetaDataSource”的引用;嵌套异常是org.springframework.beans.factory.beanCreati

  • 这是pom.xml的配置: 编辑:我在日志顶部有以下stacktrace:

  • 我的问题很简单,也很直观,但几个星期都解决不了。 我在Windows8上使用Docker。(当然是Docker工具箱+VirtualBox)。我把图像推到Docker Hub并使用Kitematic部署R shiny应用程序。 上面的图片显示它正在运行,但我无法通过给定的Docker机器IP 192.168.99.100:32772访问它

  • 问题内容: 我有一个Java应用程序。 该应用程序具有一个设置,该设置决定该应用程序是否在启动时启动。 目前,我可以通过在“启动项目”文件夹中放置/删除快捷方式来实现此目的。 但是,我想知道是否有更好的方法来处理此行为。 编辑 是的,它是Windows。抱歉,之前没有清除该内容。 该应用程序具有一个用户可以在其中触发动作的UI,并且该应用程序在运行时会定期在后台运行一些任务。 @Peter,如何在