2016-04-04 17 views
3

Ich versuche, einen Link auf meinem "Home" TabPanel auf alle anderen TabPanels meiner App zu setzen.[Shiny]: Hinzufügen eines Links zu einem anderen TabPanel in einem anderen TabPanel

Die Idee ist wie folgt:

ui = navbarPage("", 
     tabPanel("home", 
        fluidPage(
        fluidRow(box("this 1st box should lead me to tab1a")), 
        fluidRow(box("this 2nd box should lead me to tab1b")), 
        fluidRow(box("this 2nd box should lead me to tab2"))) 
      ), 
     navbarMenu("tab1", 
        tabPanel("tab1a"), 
        tabPanel("tab1b")), 
     tabPanel("tab2") 
     ) 
shinyApp(ui, server=function(input, output) {}) 

ich die Antwort in Add link panel tabs in Shiny with various top level navigation bars gesehen habe, aber ich konnte es auf meinem Code nicht implementieren, da es mit HTML beschäftigt (was ich noch nie zuvor gearbeitet habe , also bin ich nicht vertraut mit den Funktionen etc) und der Code berücksichtigt Panel Tabs mit der gleichen Registerkarte (nicht sicher, ob das ist, warum es hier nicht funktioniert, wenn es vielleicht nicht funktioniert, weil die Tabs ich versuche zu verknüpfen sind auf einer Navbarpage oder etwas).

Kann mir jemand helfen oder mir sagen, wo ich lernen könnte, wie ich das in meinem Beispiel umsetzen kann?

+0

Sie brauchen nur einen HTML-Link ('a()' in glänzend). Wenn Sie sich die URLs der normalen Schaltflächen ansehen, die auf die Registerkarten gehen, sehen sie ungefähr so ​​aus: http: //127.0.0.1: 4301/# tab-6088-1 (für mich auf Tab1a). Auch "box" unterbricht das obige für mich, da diese Funktion zum Hinzufügen von Plots, nicht HTML, dient. – alistaire

Antwort

3

Diese Antwort ist rein JavaScripted, aber sehr minimal, denke ich. Da Shiny Registerkarten mit Zufallszahlen-IDs erstellt und keinen Zugriff auf die verwendeten IDs bietet, muss dies clientseitig erfolgen. Es sind jedoch keine JavaScript-Kenntnisse erforderlich, um dies für andere Szenarien zu implementieren. Der JavaScript-Teil ist nur für Kopieren/Einfügen und der Trigger-Befehl ist einfach zu verstehen.

Was habe ich getan? Ich habe eine Funktion installiert, die den Navbar-Link für die gewünschte Registerkarte findet und nur darauf klickt. Dieses Dienstprogramm kann zu jedem Element mit dem Attribut "onclick" hinzugefügt werden. Es sind keine speziellen Tags (z. B. kein "a" -Tag) erforderlich.

Der folgende Code sollte die Anpassung dieser Lösung an Ihre Bedürfnisse erleichtern.

Hinweis: Ich habe den ursprünglichen Code mit der box verwendet, obwohl es keine visuelle Wirkung hat.

Code:

library(shiny) 
library(shinydashboard) 

ui = shinyUI(

    navbarPage("Header", 
    tabPanel("home", 
     tags$head(tags$script(HTML(' 
     var fakeClick = function(tabName) { 
      var dropdownList = document.getElementsByTagName("a"); 
      for (var i = 0; i < dropdownList.length; i++) { 
      var link = dropdownList[i]; 
      if(link.getAttribute("data-value") == tabName) { 
       link.click(); 
      }; 
      } 
     }; 
     '))), 
     fluidPage(
     fluidRow(box("this 1st box should lead me to tab1a", onclick = "fakeClick('tab1a')")), 
     fluidRow(box("this 2nd box should lead me to tab1b", onclick = "fakeClick('tab1b')")), 
     fluidRow(box("this 2nd box should lead me to tab2", onclick = "fakeClick('tab2')")) 
    ) 
    ), 
    navbarMenu("tab1", 
     tabPanel("tab1a", "Some Text inside Tab 1a."), 
     tabPanel("tab1b", "Some Text inside Tab 1b.") 
    ), 

    tabPanel("tab2", "Some Text inside Tab 2.") 
) 
) 

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

runApp(shinyApp(ui, server), launch.browser = TRUE) 

Viel Spaß!

+0

Vielen Dank, das funktioniert perfekt! Ich konnte nicht alle Schritte von dir verstehen, aber ich werde es weiter studieren;) – mihasa

Verwandte Themen