R Shiny:布尔输出值与 checkboxInput 的输出不等价

问题描述 投票:0回答:1

我正在构建一个 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)
r shiny types boolean
1个回答
0
投票

A

renderText
返回一个字符串而不是布尔值,即在条件表中你必须使用
output.pw_is_set === 'FALSE'
来检查
pw_is_set
是否等于字符串
"FALSE"
:

© www.soinside.com 2019 - 2024. All rights reserved.