R Shiny: Как скрыть tabPanel по условию на сервере - PullRequest
0 голосов
/ 27 апреля 2018

Я изменил ответ, указанный в здесь , чтобы написать очень простую систему входа / выхода из системы, используя пакет Shiny в R. Я хотел бы скрыть панель "B", если USER $ Logged - FALSE (т. Е. Пользователь вышел из системы) и показывает его, когда USER $ Logged - TRUE (т. Е. Пользователь вошел в систему). Другими словами, после запуска кода он не должен отображать панель B, пока пользователь не введет правильно имя пользователя и пароль. Я пытался использовать conditionalPanel, но она не скрывает панель B. В настоящее время она отображается постоянно, независимо от USER $ Logged. Кто-нибудь знает как это исправить?

library(shiny)
library(shinydashboard)
my_username <- "test"
my_password <- "abc"
shinyApp(
  shinyUI(
    navbarPage( tabPanel("A", uiOutput('loginpage')),
               tabPanel("B", uiOutput('page1'),conditionalPanel(condition = "output.cond1==TRUE"))
                            )
                            ),
  shinyServer(function(input, output, session) {
    USER <<- reactiveValues(Logged = FALSE)
    observe({
      if (USER$Logged == FALSE) {
        output$loginpage <- renderUI({
          box(title = "",textInput("userName", "Username"),
              passwordInput("passwd", "Password"),
              br(),
              actionButton("Login", "Log in"))})
      } else if (USER$Logged == TRUE) {
        output$loginpage <- renderUI({fluidPage(
          box(title = "",br(),br(),actionButton("logout", "Logout"))
        )

        })
      }
    })

    observeEvent(input$Login, {
      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

            } 
          }
        } 
      }

    })

    observeEvent(input$logout, {
      USER$Logged <<- FALSE
    })

    output$cond1 = reactive({
      USER$Logged==TRUE
    })

                       }     ))

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете использовать пакет shinyjs, чтобы показать / скрыть вкладку. Для этого я добавил id к navbar, чтобы мы могли выбрать вкладку для отображения / скрытия. Вы можете добавить shinyjs::show/hide в observe, чтобы показать или скрыть вкладку, когда пользователь вошел в систему или вышел из нее. Последнее замечание: вам нужно вызвать useShinyjs() где-нибудь в вашем интерфейсе, чтобы функции работали. Я также внес небольшие правки в ваш код (например, избавился от <<-. Приложение:

library(shinyjs)
shinyApp(
  shinyUI(
    navbarPage( id = "navbar",
                useShinyjs(),
                tabPanel("A", uiOutput('loginpage')),
                tabPanel("B", uiOutput('page1'),conditionalPanel(condition = "output.cond1==TRUE"))
    )
  ),
  shinyServer(function(input, output, session) {
    USER <- reactiveValues(Logged = FALSE)

    observe({
      if (USER$Logged == FALSE) {
        output$loginpage <- renderUI({
          box(title = "",textInput("userName", "Username"),
              passwordInput("passwd", "Password"),
              br(),
              actionButton("Login", "Log in"))})

        shinyjs::hide(selector = "#navbar li a[data-value=B]")

      } else if (USER$Logged == TRUE) {
        output$loginpage <- renderUI({fluidPage(
          box(title = "",br(),br(),actionButton("logout", "Logout"))
        )})

        shinyjs::show(selector = "#navbar li a[data-value=B]")
        }

    })

    observeEvent(input$Login, {
          Id.username <- which(my_username == input$userName)
          Id.password <- which(my_password == input$passwd)
          if(Id.username & Id.password) USER$Logged <<- TRUE
    })

    observeEvent(input$logout, {
      USER$Logged <- FALSE
    })
    }))
...