2017-09-07 2 views
0

Um die Freigabe eines bestimmten Status einer App zu ermöglichen, möchte ich Widget initial selected Werte basierend auf dem bereitgestellten URL-Hash festlegen. Ich weiß einfach nicht, wie man den Hash-Wert in der Initialisierungsphase weitergibt. Dies veranschaulicht:Übergeben Sie glänzende Widget-Initialwerte vom Server

library(shiny); library(shinyjs) 

urlCode = "shinyjs.pageURL = function(params){ if(params[0] != ''){location.href = location.origin + '/#' + params[0];}}" 

server = function(input, output, session) { 
    observeEvent(session$clientData$url_hash, { 
    hash = substr(session$clientData$url_hash, 2,10) 
    # I need to pass hash to selectInput selected value 
    # and pass `toupper(hash)` to tabsetPanel selected value 
    }) 

    observeEvent(input$txt, { 
    js$pageURL(input$txt) # appends tab choice to URL as hash 
    }) 
} 

ui = fluidPage(
    useShinyjs(), 
    extendShinyjs(text = urlCode), 
    selectInput("txt", "tab choice:", c("one", "two", "three"), selected = 'two'), # to be initialised as hash value 

    # tab menu 
    tabsetPanel(id = 'tab_menu', selected = 'TWO', # to be initialised as hash value 
       tabPanel("ONE", textInput('txt_one', 'one text', '')), 
       tabPanel("TWO", textInput('txt_two', 'two text', '')), 
       tabPanel("THREE", textInput('txt_three', 'three text', '')) 
) 
) 

shinyApp(ui = ui, server = server, options = list(launch.browser=T)) 

enter image description here

Werte derzeit als ‚zwei‘ (selectInput) initialisiert und ‚zwei‘ (tabsetPanel), aber diese müssen ihre Anfangswerte von dem hash Parameter in dem Fall zu übernehmen, dass die URL-Aufruf ist z http://domain/#three (im Gegensatz zu Root http://domain/). Dankbar für irgendwelche Hinweise.

Antwort

1

Sie müssen die "#" entfernen und update* Funktionen wie folgt verwenden:

library(shiny) 

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

    observe({ 
    hash <- gsub(pattern = "#", replacement = "", x = session$clientData$url_hash) 
    updateTabsetPanel(session = session, inputId = "tab_menu", selected = toupper(hash)) 
    updateSelectInput(session = session, inputId = "txt", selected = hash) 
    }) 
} 

ui <- fluidPage(

    selectInput("txt", "tab choice:", c("one", "two", "three"), selected = 'two'), # to be initialised as hash value 

    # tab menu 
    tabsetPanel(
    id = 'tab_menu', selected = 'TWO', # to be initialised as hash value 
    tabPanel("ONE", textInput('txt_one', 'one text', '')), 
    tabPanel("TWO", textInput('txt_two', 'two text', '')), 
    tabPanel("THREE", textInput('txt_three', 'three text', '')) 
) 
) 

shinyApp(ui = ui, server = server) 
+0

Das sieht gut aus. Ich bin mir bewusst, dass dies die Widget-Auswahl dauerhaft an die URL bindet, und nicht nur in der Initialisierungsphase. Gibt es eine Möglichkeit, es auf die Initialisierung zu beschränken? Ich frage mich, ob ich Probleme mit "beobachten" Triggern habe, wenn das System 2 Anweisungen zum Öffnen eines Tabs erhält - indem der Benutzer darauf klickt und dann die aktualisierte URL einen doppelten Befehl auslöst ..? – geotheory

+0

Hier ist mein aktualisierter Arbeitscode: https://gist.github.com/geotheory/38c64a770ca65a873b07f046088cb0c8 – geotheory

+1

Ja, Sie haben Recht, der Beobachter wird mehrmals ausgeführt (die Anweisungen werden gleich sein, da Sie die URL aktualisieren, wenn ein Tab ist geklickt, also nicht wirklich ein Problem). Sie können 'observeEvent' mit' once = TRUE' verwenden, der Beobachter wird nur einmal in der Initialisierungsphase ausgeführt. Ich habe deinen Kern kommentiert. – Victorp

Verwandte Themen