R Shiny - Проверьте, существует ли вкладка, прежде чем вставлять вкладку - PullRequest
0 голосов
/ 29 марта 2020

Вот минимально воспроизводимое приложение Shiny. Когда вы нажимаете «GO TO NEXT SCREEN», он создает новую вкладку в наборе вкладок, используя insertTab. Но затем, если вы вернетесь на вкладку «Вопросы об опросе», когда вы нажмете «GO К СЛЕДУЮЩЕМУ ЭКРАНУ», она создаст вторую вкладку (что плохо).

Как проверить, есть ли contacttab существует до того, как я попытаюсь insertTab? Спасибо за любое предложение. (Я попытался shinyjs::disable, shinyjs::toggle и shinyjs::toggleState безуспешно.)

library(shiny)  
library(shinyWidgets)

ui <- shinyUI(fluidPage(
    titlePanel("Check to See if Tab Exists"),
    sidebarPanel(
        h2("My Sidepanel"),
        tags$a("Brought to you by Stack Overflow", href="http://stackoverflow.com"), width=3
    ),
    mainPanel(
        tabsetPanel(id="maintabset",     
          tabPanel(title="Survey Questions", value="surveytab", fluid=TRUE,
             HTML("<h4><font color='blue'>Stuff on my Survey Tab</font></h4>"),
             h4("... more stuff ..."),
             actionBttn(inputId="gotonext", label="GO TO NEXT SCREEN", color="success", 
                        style="material-flat", block=TRUE)
          ) # end tabpanel
        ) # end tabsetpanel
    ) #end mainpanel
))

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

    observeEvent(input$gotonext, {
    # I ONLY WANT TO INSERTTAB IF CONTACTTAB DOES NOT EXIST YET
       insertTab(inputId = "maintabset", 
         tabPanel(title="Contact Information", value="contacttab", 
              textInput("email", label=h4("Email:"), value="Enter your email...") 
         ), #endtabpanel
        target="surveytab", position="after",
       ) # end inserttab

    # ... but I always want clicking "GO TO NEXT" button to put focus on contacttab
    updateTabsetPanel(session, "maintabset", selected="contacttab")
    })
})

shinyApp(ui=ui,server=server)

1 Ответ

0 голосов
/ 29 марта 2020

Поскольку ввод "email" будет существовать только в том случае, если вы создадите новую вкладку (следовательно, только если вы нажмете кнопку), вы можете детализировать некоторые условия на основе этого ввода внутри observeEvent: если этот ввод не существует ( т.е. если вы никогда не нажимали на кнопку), то создается новая вкладка; если этот ввод уже существует (т.е. вы уже нажали кнопку), то вы автоматически перенаправляетесь на эту вкладку.

library(shiny)  
library(shinyWidgets)

ui <- shinyUI(fluidPage(
  titlePanel("Check to See if Tab Exists"),
  sidebarPanel(
    h2("My Sidepanel"),
    tags$a("Brought to you by Stack Overflow", href="http://stackoverflow.com"), width=3
  ),
  mainPanel(
    tabsetPanel(id="maintabset",     
                tabPanel(title="Survey Questions", value="surveytab", fluid=TRUE,
                         HTML("<h4><font color='blue'>Stuff on my Survey Tab</font></h4>"),
                         h4("... more stuff ..."),
                         actionBttn(inputId="gotonext", label="GO TO NEXT SCREEN", color="success", 
                                    style="material-flat", block=TRUE)
                ) # end tabpanel
    ) # end tabsetpanel
  ) #end mainpanel
))

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

  observeEvent(input$gotonext, {
    if(is.null(input$email)){
      insertTab(inputId = "maintabset", 
                tabPanel(title="Contact Information", value="contacttab", 
                         textInput("email", label=h4("Email:"), value="Enter your email...") 
                ), 
                target="surveytab", position="after", select = TRUE
      )
    }
    else{
     updateTabsetPanel(session, "maintabset", selected="contacttab")
    }
  })
})

shinyApp(ui=ui,server=server)

Кроме того, вам необходимо добавить select = TRUE в insertTab, чтобы созданная вкладка выбирается автоматически.

...