2017-03-14 3 views
0

나는 관리자 만 액세스 할 수있는 (로그인 정보를 알고있는) 하나의 탭을 제외하고 웹의 모든 것을 둘러 볼 수있는 반짝이는 앱을 만들고 있습니다.반짝이 R : 로그인 후 액세스 할 수 있도록 만들기

나는 비슷한 포스트 here을 발견하고 가입을 탭을 만들기 위해 그것을 약간 수정 한 만 로그인 한 후 표시 할 수 있습니다. 그렇게하기 위해, 나는가 될

  1. UI1했다 로그인 페이지
  2. UI2은 로그인 페이지와 전체 shinydashboard로 로그인 페이지를
  3. UI3을로 가입 탭에 shinydashboard 할 수

나는 sign_up 탭을 클릭 할 때 사용자가 로그인 페이지로 안내되는 ui2 코드로 시작하도록 앱을 만들었습니다. 사용자가 성공적으로 로그인하면 로그인 페이지 대신 다른 정보가있는 ui3 shinydashboard로 이동합니다. 가입 탭 이외의 모든 것은 ui2 및 ui3에 대해 동일합니다. 나는 응용 프로그램을 시작하고 "가입"탭을 클릭하면

그러나, 그것은 오류가 없다는 오류가 표시 기능 "UI1"를 찾을 수 없습니다 여기

내가 ui.R 파일에있는 것입니다 :

library(shiny) 
library(shinydashboard) 
library(shinyjs) 
library(googleVis) 
library(flexdashboard) 
library(DT) 
library(dimple) 
library(dplyr) 

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

ui2<- dashboardPage(
    dashboardHeader(title="S-League X Shoot!"), 
    dashboardSidebar(
gaugeOutput("plt1",height='130px'), 
sidebarMenu(
    menuItem("Shoot 소개", tabName = "shoot_info", icon= icon("heart", lib= "glyphicon")), 
    menuItem("점수순위 및 분석", tabName = "leaderboard", icon= icon("bar-chart-o")), 
    menuItem("참가신청서", tabName = "signup", icon=icon("pencil", lib= "glyphicon"), 
      badgeLabel = "관리자", badgeColor = "red") 
), 
uiOutput("checkbox") 
), 
    dashboardBody(
tabItems(
    tabItem(tabName = "shoot_info", 
      fluidRow(
      tabBox(
       id= "tabtab1", width = 12, 
       tabPanel("Shoot 소개", 
         fluidRow(div(img(src="1.jpg"), img(src="2.jpg"), img(src="3.jpg"))), 
         fluidRow(div(img(src="4.jpg"), img(src="5.jpg"), img(src="6.jpg"))) 
      ), 
       tabPanel("소아암 소개 및 후원", 
         fluidRow(tags$a(img(src="66.jpg"),href="http://www.soaam.or.kr/donation/introduction.php?PHPSESSID=80f03a3e88d2ee7137d904c22e00a75b")), 
         fluidRow(div(img(src="11.jpg"))), 
         fluidRow(div(img(src="22.png"))), 
         fluidRow(div(img(src="33.png"))), 
         fluidRow(div(img(src="44.png"))), 
         fluidRow(div(img(src="55.png"))) 
      ), 
       tabPanel("2016년도 Shoot 활동", 
         fluidRow(div(img(src="111.jpg"))), 
         fluidRow(div(img(src="222.jpg"))), 
         fluidRow(div(img(src="333.jpg"))), 
         fluidRow(div(img(src="444.jpg"))), 
         fluidRow(div(img(src="555.jpg"))), 
         fluidRow(div(img(src="666.jpg"))) 
      ) 
      ) 
     ) 
), 
    tabItem(tabName = "leaderboard", 
      fluidRow(
      tabBox(
       id= "tabtab2", width = 12, 
       tabPanel("선수별순위", 
         dataTableOutput("content"), 
         dimpleOutput("distPlot1"), 
         width=12), 
       tabPanel("팀별순위", 
         uiOutput("summa2"), 
         dimpleOutput("distPlot2"), 
         width=6), 
       tabPanel("단과대별순위", 
         uiOutput("summa3"), 
         dimpleOutput("distPlot3"), 
         width=6) 
      ) 
     ) 
), 
    tabItem(tabName = "signup", 
      uiOutput("page") #This is the only difference between ui2 and ui3 
) 

)) 
) 

ui3<- dashboardPage(
    dashboardHeader(title="S-League X Shoot!"), 
    dashboardSidebar(
gaugeOutput("plt1",height='130px'), 
sidebarMenu(
    menuItem("Shoot 소개", tabName = "shoot_info", icon= icon("heart", lib= "glyphicon")), 
    menuItem("점수순위 및 분석", tabName = "leaderboard", icon= icon("bar-chart-o")), 
    menuItem("참가신청서", tabName = "signup", icon=icon("pencil", lib= "glyphicon"), 
      badgeLabel = "관리자", badgeColor = "red") 
), 
uiOutput("checkbox") 
), 
    dashboardBody(
tabItems(
    tabItem(tabName = "shoot_info", 
      fluidRow(
      tabBox(
       id= "tabtab1", width = 12, 
       tabPanel("Shoot 소개", 
         fluidRow(div(img(src="1.jpg"), img(src="2.jpg"), img(src="3.jpg"))), 
         fluidRow(div(img(src="4.jpg"), img(src="5.jpg"), img(src="6.jpg"))) 
      ), 
       tabPanel("소아암 소개 및 후원", 
         fluidRow(tags$a(img(src="66.jpg"),href="http://www.soaam.or.kr/donation/introduction.php?PHPSESSID=80f03a3e88d2ee7137d904c22e00a75b")), 
         fluidRow(div(img(src="11.jpg"))), 
         fluidRow(div(img(src="22.png"))), 
         fluidRow(div(img(src="33.png"))), 
         fluidRow(div(img(src="44.png"))), 
         fluidRow(div(img(src="55.png"))) 
      ), 
       tabPanel("2016년도 Shoot 활동", 
         fluidRow(div(img(src="111.jpg"))), 
         fluidRow(div(img(src="222.jpg"))), 
         fluidRow(div(img(src="333.jpg"))), 
         fluidRow(div(img(src="444.jpg"))), 
         fluidRow(div(img(src="555.jpg"))), 
         fluidRow(div(img(src="666.jpg"))) 
      ) 
      ) 
     ) 
), 
    tabItem(tabName = "leaderboard", 
      fluidRow(
      tabBox(
       id= "tabtab2", width = 12, 
       tabPanel("선수별순위", 
         dataTableOutput("content"), 
         dimpleOutput("distPlot1"), 
         width=12), 
       tabPanel("팀별순위", 
         uiOutput("summa2"), 
         dimpleOutput("distPlot2"), 
         width=6), 
       tabPanel("단과대별순위", 
         uiOutput("summa3"), 
         dimpleOutput("distPlot3"), 
         width=6) 
      ) 
     ) 
), 
    tabItem(tabName = "signup", 
      fluidRow(
      tabBox(
       id= "tabset1", width = 12, 
       tabPanel("참가신청서", textInput("name", "이름"), 
         radioButtons("gender", "성별", list("남자","여자")), 
         selectInput("college", "대학", 
            choices = list("간호대학", "경영대학", 
                "공과대학", "농업생명과학대학", 
                "미술대학", "법과대학", 
                "사범대학", "사회과학대학", 
                "수의과대학", "생활과학대학", 
                "약학대학", "음악대학", 
                "인문대학", "의과대학", 
                "자연과학대학", "기타"), 
            selected = 1), 
         selectInput("team", "교내 소속축구팀", 
            choices = list("싸커21", "아르마다", 
                "에코플러스", "아크로", 
                "P.O.S", "공대", 
                "자연대", "관악사", 
                "농대축구부 휘모리", "지오싸카스", 
                "새츠", "샥스", 
                "FC SEES", "Cells United", 
                "프리템포", "남풍", 
                "없음")), 
         textInput("score", "점수"), 
         actionButton("click_counter","Submit"), width=12), 
       tabPanel("참가자 삭제", textInput("delete_name", "삭제할 참가자 이름을 아래 박스에 기입한 뒤, 삭제 버튼을 눌러주세요."), 
         actionButton("delete_button","삭제"), 
         h4("주의사항: 동명이인이 있을시, 모두가 삭제되므로 삭제하지 않고자 하는 참가자의 정보를 다시 '참가신청서' tab에서 기입해줘야 함."),width=12) 
      ) 
     ), 
      fluidRow(
      box(dataTableOutput("nText"), width=12) 
     ) 
) 

)) 
) 

이 내가 server.R 파일에있는 것입니다 :

server <- shinyServer(function(input, output, session) { 

    Logged = FALSE; 
    my_username <- "test" 
    my_password <- "test" 

    USER <- reactiveValues(Logged = Logged) 



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

    output$page <- renderUI({ 
if (USER$Logged == FALSE){ 
    output$page <- renderUI({ 
    div(class="outer",do.call(bootstrapPage,c("",ui1()))) 
    }) 
} 
if (USER$Logged == TRUE) 
    ui3 
    }) 
}) 

shinyApp(ui = ui2, server = server) 
+0

코드에 사용중인 모든 라이브러리를 추가하십시오! –

+0

@ PorkChop 코드에 libs를 추가했습니다. – Oleole

답변

1

그것은 흥미로운 기술이며, 내가 가진 일단 그것은 WA 작업 고치는 것이 어렵지 않으며 필요한 기능을 추가하십시오. 여기

library(shiny) 
library(shinydashboard) 
library(ShinyDash) 
library(rcdimple) 

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

ui33 <-tagList(
    wellPanel("Admin-참가신청서", textInput("name", "이름"), 
        radioButtons("gender", "성별", list("남자","여자")), 
        selectInput("college", "대학", 
           choices = list("간호대학", "경영대학", 
               "공과대학", "농업생명과학대학", 
               "미술대학", "법과대학", 
               "사범대학", "사회과학대학", 
               "수의과대학", "생활과학대학", 
               "약학대학", "음악대학", 
               "인문대학", "의과대학", 
               "자연과학대학", "기타"), 
           selected = 1), 
        selectInput("team", "교내 소속축구팀", 
           choices = list("싸커21", "아르마다", 
               "에코플러스", "아크로", 
               "P.O.S", "공대", 
               "자연대", "관악사", 
               "농대축구부 휘모리", "지오싸카스", 
               "새츠", "샥스", 
               "FC SEES", "Cells United", 
               "프리템포", "남풍", 
               "없음")), 
        textInput("score", "점수"), 
        actionButton("click_counter","Submit"), width=12), 
      tabPanel("참가자 삭제", textInput("delete_name", "삭제할 참가자 이름을 아래 박스에 기입한 뒤, 삭제 버튼을 눌러주세요."), 
        actionButton("delete_button","삭제"), 
        h4("주의사항: 동명이인이 있을시, 모두가 삭제되므로 삭제하지 않고자 하는 참가자의 정보를 다시 '참가신청서' tab에서 기입해줘야 함."),width=12) 
     ) 



ui2<- dashboardPage(
    dashboardHeader(title="S-League X Shoot!"), 
    dashboardSidebar(
    gaugeOutput("plt1",height='130px'), 
    sidebarMenu(
     menuItem("Shoot 소개", tabName = "shoot_info", icon= icon("heart", lib= "glyphicon")), 
     menuItem("점수순위 및 분석", tabName = "leaderboard", icon= icon("bar-chart-o")), 
     menuItem("참가신청서", tabName = "signup", icon=icon("pencil", lib= "glyphicon"), 
       badgeLabel = "관리자", badgeColor = "red") 
    ), 
    uiOutput("checkbox") 
), 
    dashboardBody(
    tabItems(
     tabItem(tabName = "shoot_info", 
       fluidRow(
       tabBox(
        id= "tabtab1", width = 12, 
        tabPanel("Shoot 소개", 
          fluidRow(div(img(src="1.jpg"), img(src="2.jpg"), img(src="3.jpg"))), 
          fluidRow(div(img(src="4.jpg"), img(src="5.jpg"), img(src="6.jpg"))) 
       ), 
        tabPanel("소아암 소개 및 후원", 
          fluidRow(tags$a(img(src="66.jpg"),href="http://www.soaam.or.kr/donation/introduction.php?PHPSESSID=80f03a3e88d2ee7137d904c22e00a75b")), 
          fluidRow(div(img(src="11.jpg"))), 
          fluidRow(div(img(src="22.png"))), 
          fluidRow(div(img(src="33.png"))), 
          fluidRow(div(img(src="44.png"))), 
          fluidRow(div(img(src="55.png"))) 
       ), 
        tabPanel("2016년도 Shoot 활동", 
          fluidRow(div(img(src="111.jpg"))), 
          fluidRow(div(img(src="222.jpg"))), 
          fluidRow(div(img(src="333.jpg"))), 
          fluidRow(div(img(src="444.jpg"))), 
          fluidRow(div(img(src="555.jpg"))), 
          fluidRow(div(img(src="666.jpg"))) 
       ) 
       ) 
      ) 
    ), 
     tabItem(tabName = "leaderboard", 
       fluidRow(
       tabBox(
        id= "tabtab2", width = 12, 
        tabPanel("선수별순위", 
          dataTableOutput("content"), 
          dimpleOutput("distPlot1"), 
          width=12), 
        tabPanel("팀별순위", 
          uiOutput("summa2"), 
          dimpleOutput("distPlot2"), 
          width=6), 
        tabPanel("단과대별순위", 
          uiOutput("summa3"), 
          dimpleOutput("distPlot3"), 
          width=6) 
       ) 
      ) 
    ), 
     tabItem(tabName = "signup", 
       uiOutput("page") #This is the only difference between ui2 and ui3 
    ) 

    )) 
) 


server <- shinyServer(function(input, output, session) { 

    Logged = FALSE; 
    my_username <- "test" 
    my_password <- "test" 

    USER <- reactiveValues(Logged = Logged) 

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

    output$page <- renderUI({ 
    if (USER$Logged){ 
     return({ div(class="outer",do.call(bootstrapPage,c("",ui33))) }) 
    } else { 
     return({ div(class="outer",do.call(bootstrapPage,c("",ui1))) }) 
    } 
    }) 
}) 

shinyApp(ui = ui2, server = server) 

그리고 관리자 로그인됩니다 : 여기에 코드입니다

enter image description here

그리고 여기에 로그인 후 이미지 : 결국

enter image description here

나는 단지 해야만했다

    ,
  • 이 빛나는 output$pagerenderUI 코드 블록에서 함수 호출 (괄호)를 제거
  • 반짝 당신의 탭을 생성 입력을 잘라 u33라는 새로운 반짝 입력 기능에 그것을 넣어.
  • output$page의 로직을 변경하여 로그인이 발생했는지 여부에 따라 적합한 반짝이는 입력 기능 - u1 또는 u33 -을 반환하십시오.

Shiny 런타임은 일반적인 R 프로그램과 약간 다릅니다. 이러한 반응 블록은 사전에 필요한 UI 기능을 평가하는 특별한 Shiny 핸들러에 의해 설정되고 실행됩니다.따라서 함수는 반응 블록이 실행 중일 때 실제로 존재하지 않으므로 누락 된 u1 함수에 대한 오류 메시지를 설명합니다.

+0

위의 그림에서 보여준대로 로그인 페이지가 표시되지만 원하는 것은 ui3의 ** 가입 ** 탭에있는 내용을 볼 수 있습니다. 로그인하시오. 아이디어가 있으십니까? – Oleole

+0

그래, 지금도 고쳐 놨어. –

+1

죄송합니다. 방금 했어요 :) 도와 줘서 고마워! – Oleole