gpt4 book ai didi

r - Shiny App 中的不同页面

转载 作者:行者123 更新时间:2023-12-04 10:36:15 26 4
gpt4 key购买 nike

我想在我 Shiny 的仪表板上有不同的页面。首先,我创建了一个登录页面来为用户和管理员提供身份验证。之后,如果管理员登录系统想要查看一些用户无法访问的选项。
问题:当我以用户或管理员身份登录时,我可以在后台看到主 ui.r 页面,我该如何解决此问题以仅看到 admin.R 或 user.R?
用户登录时显示仪表板,管理员登录时显示仪表板和小部件。
所以我决定在 R 中创建 4 个页面,如下所示:
用户界面

library(shiny)
library(shinydashboard)
shinyUI(
dashboardPage(
dashboardHeader(title = "Navigational Support System"),
dashboardSidebar(),
dashboardBody(
box(
uiOutput("page")
)
)
)
)

服务器
library(shiny)
library(shinydashboard)
source("user.R")
source("admin.R")
############################################################################################################
#Login USER and ADMIN TO the System
my_username <- c("test","admin")
my_password <- c("test","123")
get_role=function(user){
if(user=="test") {
return("TEST")
}else{
return("ADMIN")
}
}

get_ui=function(role){
if(role=="TEST"){
return(list_field_user)
}else{
return(list_field_admin)
}
}


shinyServer(function(input, output,session) {

USER <- reactiveValues(Logged = FALSE,role=NULL)

ui1 <- function(){
tagList(
div(id = "login",
wellPanel(textInput("userName", "Username"),
passwordInput("passwd", "Password"),
br(),actionButton("Login", "Log in")))
#tags$style(type="text/css", '#login{ width:750px; float:left;}')

)}

ui2 <- function(){tagList(tabPanel("NSS",get_ui(USER$role)))}

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
USER$role=get_role(Username)

}
}
}
}
}
})
observe({
if (USER$Logged == FALSE) {

output$page <- renderUI({
div(class="outer",do.call(bootstrapPage,c("Please Login",ui1())))
})
}
if (USER$Logged == TRUE) {
output$page <- renderUI({
div(class="outer",do.call(navbarPage,c(inverse=TRUE,title = "Welcome Admin!",ui2())))
})
#print(ui)
}
})
##################################################################################################

})

管理员
list_field_admin =

shinyUI(
dashboardPage(
dashboardHeader(title = "Decison Support System"),
dashboardSidebar( sidebarMenu(
menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")),
menuItem("Widgets", tabName = "widgets", icon = icon("th"))
)
),
dashboardBody(
)

))

用户名
list_field_user =  shinyUI( 
dashboardPage(
dashboardHeader(title = "Decison Support System"),
dashboardSidebar( sidebarMenu(
menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard"))

)
),
dashboardBody(
)

))

最佳答案

如果我理解你,你可以在你的附加文件中创建不同的列表

1) 管理员.r

admin_title="Decison Support System"
admin_side=list(sidebarMenu(
menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")),
menuItem("Widgets", tabName = "widgets", icon = icon("th"))
))
admin_main=list(

tabItems(
tabItem(tabName = "dashboard", list(h1("1234"),h2("234"))),
tabItem(tabName = "widgets", list(fluidRow(column(6,numericInput("inputtest", "test", value = 0),column(6,actionButton(inputId ="test1",label ="go")))))
)
))

2) 用户.r
test_title="Decison Support System"
test_side=list(sidebarMenu(
menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard"))))

test_main=list(

tabItems(
tabItem(tabName = "dashboard", list(h1("user"),h2("user")))
))

然后改变一点你的 UI 和服务器

用户界面:
library(shiny)
library(shinydashboard)
shinyUI(
dashboardPage(
dashboardHeader( title=textOutput("title")),
dashboardSidebar(uiOutput("side")),
dashboardBody(
uiOutput("page")

)
)

)

服务器 :
library(shiny)
library(shinydashboard)
source("user.R")
source("admin.R")

my_username <- c("test","admin")
my_password <- c("test","123")
get_role=function(user){

if(user=="test") {

return("TEST")
}else{

return("ADMIN")
}
}

get_ui=function(role){
itog=list()
if(role=="TEST"){
itog$title=test_title
itog$main=test_main
itog$side=test_side
return(itog)
}else{
itog$title=admin_title
itog$main=admin_main
itog$side=admin_side
return(itog)
}
}


shinyServer(function(input, output,session) {

USER <- reactiveValues(Logged = FALSE,role=NULL)

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: -10px;margin-left: -150px;}")
)}


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
USER$role=get_role(Username)

}
}
}
}
}
})
observe({
if (USER$Logged == FALSE) {

output$page <- renderUI({
box(
div(class="outer",do.call(bootstrapPage,c("",ui1()))))
})
}
if (USER$Logged == TRUE) {
itog=get_ui(USER$role)
output$title<- renderText({
itog$title
})
output$side <- renderUI({
itog$side
})
output$page <- renderUI({
itog$main
})
}
})
})

关于r - Shiny App 中的不同页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33814656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com