Как получить доступ к идентификаторам вкладок Shiny для использования с глянцевыми инструментами? - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь настроить очень простой блок для пользователей, где они не смогут получить доступ к вкладке из tabPanel, если они не введут пароль. Я использую shinyalerts для этого, и до сих пор он отлично работает в качестве специальной системы паролей.

Но когда я пытаюсь настроить его так, чтобы он наблюдал событие выбора panel_2 в моем коде, он просто всплывает в начале приложения. Он реагирует, когда я нажимаю panel_2, но как мне заставить его перестать появляться, как только я открываю приложение, и только когда input$tab == "panel_2" истинно?

Я вижу, как observe печатать идентификатор панели в server, поэтому я знаю, что он существует.

ПРИМЕЧАНИЕ. Я использую версию GitHub-репо освещение

library(shiny)
library(shinyalert)
library(shinydashboardPlus)

#password accept function
password_accept = function(x){
  if(x =='1234'){
    shinyalert('Welcome Administrator')
  } else {
    shinyalert("TRY AGAIN",
               "Enter Password for Admin Access to this Page"
               ,type = "input"
               ,inputType = "password"
               ,time = 0
               #,inputValue = "Enter Password"
               ,callbackR = password_accept
    )
  }
}


#example of problem
ui = fluidPage(#useShinyalert(),
  navbarPage("Sample",
             id = 'tabs',
             tabPanel("panel1", useShinydashboardPlus(),
                      fluidRow(column(9,offset = 1,
                                      h3(htmlOutput("sample app")))
                               ),
                      column(4,offset = 5,
                             boxPlus(solidHeader = T, collapsible = F, collapsed = F, closable = F, title = '', status = 'success',
                                     uiOutput('fn'),br(),
                                     uiOutput('ln'),br() 
                             ))
                      ),
             tabPanel("panel2",useShinyalert(), # add shiny alert to act as pwd signin
                      column(6,
                             fluidRow(
                               ))
             )))


server = (function(input, output,session) {

  #print the tab being accessed
  observe({print(input$tabs)})

  #admin pop up
  observeEvent(input$tabs=='panel2', 
               {
                 shinyalert("",
                            "Enter Password for Admin Access to this Page"
                            ,type = "input"
                            ,inputType = "password"
                            ,time = 0
                            #,inputValue = "Enter Password"
                            ,callbackR = password_accept
                 )
               }
  )

  output$fn = renderUI({
    textInput(inputId = "first_name", label = "First Name")
  })

  output$ln = renderUI({
    textInput(inputId = "last_name", label = "Last Name")
  })
})

shinyApp(ui,server)

1 Ответ

0 голосов
/ 14 мая 2019

Вам необходимо установить ignoreInit = TRUE для вашего observeEvent:

library(shiny)
library(shinyalert)
library(shinydashboardPlus)
library(shinyWidgets)

#password accept function
password_accept = function(x){
  if(x =='1234'){
    shinyalert('Welcome Administrator')
  } else {
    shinyalert("TRY AGAIN", 
               "Enter Password for Admin Access to this Page"
               , type = "input"
               , inputType = "password"
               , time = 0
               #, inputValue = "Enter Password"
               , callbackR = password_accept
    )
  }
}


#example of problem
ui = fluidPage(#useShinyalert(), 
  navbarPage("Sample", 
             id = 'tabs', 
             tabPanel("panel1", useShinydashboardPlus(), 
                      fluidRow(column(9, offset = 1, 
                                      h3(htmlOutput("sample app")))
                      ), 
                      column(4, offset = 5, 
                             boxPlus(solidHeader = T, collapsible = F, collapsed = F, closable = F, title = '', status = 'success', 
                                     uiOutput('fn'), br(), 
                                     uiOutput('ln'), br() 
                             ))
             ), 
             tabPanel("panel2", useShinyalert(), # add shiny alert to act as pwd signin
                      column(6, 
                             fluidRow(
                             ))
             )))


server = (function(input, output, session) {

  #print the tab being accessed
  observe({print(input$tabs)})

  #admin pop up
  observeEvent(input$tabs, 
               {
                 if(input$tabs == 'panel2'){
                   shinyalert("", 
                              "Enter Password for Admin Access to this Page"
                              , type = "input"
                              , inputType = "password"
                              , time = 0
                              #, inputValue = "Enter Password"
                              , callbackR = password_accept
                   )
                 }

               }, ignoreInit = TRUE
  )

  output$fn = renderUI({
    textInput(inputId = "first_name", label = "First Name")
  })

  output$ln = renderUI({
    textInput(inputId = "last_name", label = "Last Name")
  })
})

shinyApp(ui, server)
...