我正在尝试制作一个简单的应用程序,在用户登录ind:之前隐藏信息
library(shiny)
library(glue)
library(tidyverse)
server <- function(input, output, session) {
#check login
logged_in = eventReactive(input$login, {
if (input$username == "test" && input$password == "test") {
return(T)
} else {
return(F)
}
})
username = reactive(input$username)
output$login_status = logged_in
output$login_status_text = renderText({
if (logged_in()) {
return(glue("Logged in as: {username()}"))
} else {
return("Not logged in / incorrect login")
}
})
output$data = renderDataTable({
if (logged_in()) {
y = iris
} else {
y = tibble(text = "This should not be seen!")
}
y
})
}
ui <- fluidPage(
textInput("username", "What's your username?"),
passwordInput("password", "What's your password?"),
actionButton("login", "Login!"),
textOutput("login_status_text"),
#show secret data if logged in
conditionalPanel(condition = "output.login_status()", {
dataTableOutput("data")
})
)
shinyApp(ui, server)
问题是,这个条件在某种程度上总是被评估为真的。我尝试过output.login_status
,它总是被评估为FALSE
。如何使UI显示/隐藏基于输出服务器端而非输入客户端值的内容?
您必须在服务器中添加以下行:
outputOptions(output, "login_status", suspendWhenHidden = FALSE)
像这样:
output$login_status = reactive(logged_in())
outputOptions(output, "login_status", suspendWhenHidden = FALSE)
此外,条件应该是:
condition = "output.login_status"