6

I have built the following template for my shiny app.

      ##ui.R
      shinyUI(navbarPage("My Application",
      tabPanel
      (
        "Select Data range",
        sidebarLayout
        (
            sidebarPanel
            (
                h3("Select Data Range"),
                selectInput("select", label = h3("Select Sector"),choices = list("Sector 1" = 1, "Sector 2" = 2,"Sector 3" = 3), selected = 1),br(),
                dateRangeInput("dates", label = h3("Select Date range")),br(),
                submitButton("Submit"),br(),
                actionButton("action", label = "Proceed to select resolution")
            ),
            mainPanel("Output")
        )
      ),

      tabPanel
      (
        "Select Resolution",
        sidebarLayout
        (
            sidebarPanel
            (
                h3("Select Resolution"),
                numericInput("num", label = h3("Select X-Grid Size"), value = 2),br(),
                numericInput("num", label = h3("Select Y-Grid Size"), value = 2),br(),
                numericInput("num", label = h3("Outlier Removal"), value = 2),br(),
                numericInput("num", label = h3("Frequency"), value = 2),br(),
                submitButton("Submit"),br(),
                #actionButton("action", label = "Proceed to Service Parameters")
            ),
            mainPanel("Output")
        )
      )

    ))

And the server file is kept empty for now:

      ##server.R
      shinyServer(function(input, output) {
      })

The problem is ideally I would like to use a input like action button on first tabPanel to navigate to second tab panel. Any suggestion about an alternative would be appreciated equally.

jdharrison
  • 30,085
  • 4
  • 77
  • 89
anonR
  • 849
  • 7
  • 26

1 Answers1

7

You can send a custom message:

ui.R

shinyUI(navbarPage("My Application",

               tabPanel
               (
                 "Select Data range",
                 sidebarLayout
                 (
                   sidebarPanel
                   (tags$head(tags$script('
                                     Shiny.addCustomMessageHandler("myCallbackHandler",
                                       function(typeMessage) {console.log(typeMessage)
                                          if(typeMessage == 1){
                                          console.log("got here");
                                          $("a:contains(Select Resolution)").click();
                                          }
                                          if(typeMessage == 2){
                                          $("a:contains(Select Data range)").click();
                                          }
                                          });
                                          ')),
                     h3("Select Data Range"),
                     selectInput("select", label = h3("Select Sector"),choices = list("Sector 1" = 1, "Sector 2" = 2,"Sector 3" = 3), selected = 1),br(),
                     dateRangeInput("dates", label = h3("Select Date range")),br(),
                     actionButton("action", label = "Proceed to select resolution")
                   ),
                   mainPanel("Output")
                 )
               ),

               tabPanel
               (
                 "Select Resolution",
                 sidebarLayout
                 (
                   sidebarPanel
                   (
                     h3("Select Resolution"),
                     numericInput("num1", label = h3("Select X-Grid Size"), value = 2),br(),
                     numericInput("num2", label = h3("Select Y-Grid Size"), value = 2),br(),
                     numericInput("num3", label = h3("Outlier Removal"), value = 2),br(),
                     numericInput("num4", label = h3("Frequency"), value = 2),br(),
                     actionButton("action1", label = "Proceed to Service Parameters")

                   ),
                   mainPanel("Output"),

                 )
               )

))

server.R

library(shiny)
shinyServer(function(input, output,session) {
  observe({
    if(input$action > 0){
      print('1')
      session$sendCustomMessage("myCallbackHandler", "1")
    }
  })
  observe({
    if(input$action1 > 0){
      print('2')
      session$sendCustomMessage("myCallbackHandler", "2")
    }
  })
}
)

Also you cannot have objects with the same id's. Note all your numericInput and actionButton had the same id's. Also I removed the submit buttons not sure you want more then one of these.

jdharrison
  • 30,085
  • 4
  • 77
  • 89
  • Thanks, That's exactly what I needed. The objects were with same id's because this was just basic layout of the app and I was gonna rename them as i use them in server.R. – anonR Sep 18 '14 at 20:11