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))
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.
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
Hier ist mein aktualisierter Arbeitscode: https://gist.github.com/geotheory/38c64a770ca65a873b07f046088cb0c8 – geotheory
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