我目前正在尝试构建一个应用程序,以可视化员工随时间的表现。我正在尝试创建一个受密码保护的仪表板,标记为经理的用户可以在其中查看所有其他用户统计数据,而非经理用户只能查看自己的统计数据。然而,我无法让它发挥作用。这是我迄今为止所拥有的。用户列表是与其用户名匹配的员工(2个变量(,凭据列表是用户名和密码(2个变数(。问题出在观察功能imo的某个地方。如果用户不是经理,我希望他们的选择按钮锁定在自己的名字上。即会话$user==用户$user
任何指导都将不胜感激。
data<-read.csv("Data/data.csv")
data$Create.Date<-as.Date(data$Create.Date)
credentials<-unique(read.csv("Data/credentials.csv"))
ui<-secure_app(head_auth=tags$script(inactivity),
dashboardPage(
dashboardHeader(title = "Services Dashboard"),
dashboardSidebar(
selectInput("name","Select a User", users[,1]),
dateRangeInput("date", "Select a Date Range",format="mm-dd-yy"),
actionButton("go", "Go")
),
dashboardBody(
plotlyOutput("plot"),
tableOutput("table"),
)
)
)
server<-function(input, output, session){
res_auth<-secure_server(check_credentials = check_credentials(credentials))
user<-reactive({
session$user
}
)
manager<-reactive({
if(user()=="manager"){
return(TRUE)
}else{
return(FALSE)
}
})
observe({
if(manager()==FALSE){
updateSelectInput(session, "names", "Select A User",
choices=users$user[users$username==user()])
}
})
masterdata<-eventReactive(input$go, {
data %>%
filter(
as.Date(Create.Date) >= as.Date(input$date[1]),
as.Date(Create.Date) <= as.Date(input$date[2]),
Staff.Created == input$name)
})
aggdata<-eventReactive(input$go, {
data %>%
filter(
as.Date(Create.Date) >= as.Date(input$date[1]),
as.Date(Create.Date) <= as.Date(input$date[2]),
Staff.Created == input$name)%>%
summarise(`Services Provided in Period Selected`=sum(count))
})
output$plot<-renderPlotly({
ggplot(masterdata(),
aes(x=Create.Date, y=count, label=count),
xmin=input$date[1], xmax=input$date[2], ymin=0, fill = input$date)+
xlab("Date")+
ylab("Services Provided")+
geom_line(group=1, colour="#000099")+
theme(axis.text.x = element_text(angle=45, vjust=0.5, size=8))+
scale_x_date(breaks = "days", date_labels = "%m.%d")+
geom_point()
})
output$table<-renderTable({
aggdata()
})
}
shinyApp(ui = ui, server = server)
这是我的错误代码:警告:if中的错误:参数的长度为零
我删除了所有内容,只删除了一些基本内容来模拟您想要的内容。我改变的是:
我一直使用select输入的id(在这个示例中是"名称"(。否则,您正试图访问一个不存在的input
元素。当你尝试读取它时,这只会返回null
另一个可能的原因可能发生在初始化过程中。我不太确定事情发生的顺序。但是,如果在第一次评估代码时未设置session$user
,则您的代码将假设为非管理员场景,并且一旦所有信息可用,就不会再次更新。因此:
null
。这可能发生在初始化过程中
else
分支,以便在管理员登录时恢复select输入中的所有名称library(shiny)
users <- data.frame(
username = LETTERS[1:10],
user = letters[1:10]
)
ui <- fluidPage(
# Needed for mocking the user id
checkboxInput("MockScenario", "Mock a manager scenario"),
# Original code
selectInput("names", "Select a User", users$username),
dateRangeInput("date", "Select a Date Range", format="mm-dd-yy"),
actionButton("go", "Go")
)
server <- function(input, output, session) {
user <- reactive({
# session$user # is not used in this sample but the mock
## Mocked user
if (input$MockScenario == TRUE)
"manager"
else
sample(users$user, 1)
})
manager <- reactive({
if (isTruthy(user()) && user() == "manager") {
return(TRUE)
} else {
return(FALSE)
}
})
observe({
if(manager() == FALSE) {
updateSelectInput(session, "names", "Select A User",
choices = users$username[users$user == user()])
} else {
updateSelectInput(session, "names", "Select A User",
choices = users$username)
}
})
}
shinyApp(ui, server)