2015-11-19 12 views
7

Ich möchte verschiedene Seiten in meinem glänzenden Dashboard haben. Als erstes habe ich eine Login-Seite erstellt, um Benutzer und Admin authentifizieren zu können. Danach, wenn die Admin-Anmeldung im System einige Optionen sehen möchte, auf die der Benutzer nicht zugreifen kann. Frage: Wenn ich mich als Benutzer oder Administrator anmelde, kann ich die Hauptseite von ui.r im Hintergrund sehen. Wie kann ich dieses Problem beheben, um nur admin.R oder user.R zu sehen? Wenn sich der Benutzer anmeldet, wird das Dashboard angezeigt und wenn sich der Administrator anmeldet, werden das Dashboard und das Widget angezeigt. Also beschloss ich, 4 Seiten in R zu erstellen, wie folgend: ui.RVerschiedene Seiten in Shiny App

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

server.R

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) 
    } 
    }) 
    ################################################################################################## 

}) 

admin.r

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(
) 

)) 

user.r

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

    ) 
    ), 
    dashboardBody(
    ) 

)) 

Antwort

11

Wenn ich Sie undertand rechts können Sie verschiedene Listen in erstellen Sie weitere Dateien

1) admin.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) user.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"))) 
)) 

Dann ein bisschen Sie UI ändern und

Server

UI:

library(shiny) 
library(shinydashboard) 
shinyUI( 
    dashboardPage(
    dashboardHeader(title=textOutput("title")), 
    dashboardSidebar(uiOutput("side")), 
    dashboardBody(
      uiOutput("page") 

    ) 
) 

) 

Server:

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 
     }) 
     } 
    }) 
}) 
+0

Vielen Dank. – user