我正在构建一个 Shiny 应用程序,其中包含由布尔表达式触发的
conditionalPanel()
。
在我的最终应用程序中,希望有一个密码创建面板,为尚未设置密码的用户显示。密码查找基于
selectInput()
小部件,该小部件允许用户选择其用户名和将用户名映射到密码(密码哈希代码)的外部 CSV。
要触发
conditionalPanel()
,用户名选择不得等于默认值(“---”),并且名为 pw_is_set
的输出变量的值必须等于 FALSE
。 (当所选用户的密码查找返回值 NA
时,应该发生后者)
奇怪的是,我遇到了一个问题,其中
conditionalPanel()
的行为取决于我如何设置 pw_is_set
的值。当我使用 checkboxInput()
时,逻辑完美运行。但是,当我尝试编写返回(基 R)布尔值的自定义表达式时,conditionalPanel()
永远不会触发。在这两种情况下,我都使用 output$pw_is_set
为 renderText()
赋值。
我希望有人可以帮助我理解其中的区别,因为
checkboxInput()
对于我的最终应用程序来说不可行。
以下代码应该完全重现我的问题。默认版本使用
checkboxInput()
并产生我正在寻找的确切行为。
可以通过注释第 22 行和第 65 行以及取消注释第 62-64 行来切换不工作的版本。
library(shiny)
library(cli)
##### Facsimile of the external 'user_roster' CSV #####
user_roster <- data.frame(name=c("User A", "User B", "User C"),
password_hash=rep(NA, 3),
stringsAsFactors=F)
user_list <- user_roster$name
##### UI #####
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
selectInput("selected_user", h3("Name"),
choices=c("---", get("user_list", envir=.GlobalEnv))),
## Temp Controls & Data Validation
br(),
h4("Temporary Controls & Data Validation"),
#checkboxInput("pw_is_set", "Password is set", FALSE),
p("Value returned by ", em("Password is Set"), ": ", textOutput("pw_is_set", inline=T)),
br(),
p("Name of selected user: ", textOutput("user_name", inline=T)),
p("Password hash for selected user: ", textOutput("user_pw_hash", inline=T)),
br(),
## Password creation panel
conditionalPanel(
condition = "input.selected_user!='---' && output.pw_is_set==false",
p(strong("It looks like this is your first time here. Please create a password for your account.")),
p("Please do not use your [work] password or any other sensitive identifiers. This password is intended to maintain user privacy, but is not truly secure", style="color:red"),
passwordInput("new_pw_1", "Password"),
passwordInput("new_pw_2", "Re-type password")
)
),
## Main panel
mainPanel("MAIN PANEL")
)
)
##### Server #####
server <- function(input, output, session){
# Create an output object called `user_name` based on user-provided input
output$user_name <- renderText({
user_name <- input$selected_user
return(user_name)
})
# Create an output object called `user_pw_hash` based on user-provided input
output$user_pw_hash <- renderText({
user_roster <- get("user_roster", envir=.GlobalEnv)
user_pw_hash <- user_roster$password_hash[which(user_roster$name==input$selected_user)]
return(user_pw_hash)
})
# Create an output object called `pw_is_set` based on user-provided input
output$pw_is_set <- renderText({
user_roster <- get("user_roster", envir=.GlobalEnv)
user_pw_hash <- user_roster$password_hash[which(user_roster$name==input$selected_user)]
pw_is_set <- !is.na(user_pw_hash)
#pw_is_set <- input$pw_is_set
return(pw_is_set)
})
}
##### App Launcher #####
shinyApp(ui=ui, server=server)