我爲Shiny應用程序使用HTML模板,並試圖根據URI的片段標識符複製儀表板的功能tabPanel
。
具體來說,給定一些充當頁面錨點的導航鏈接,我希望Shiny獲取該片段標識符,根據需要更新任何服務器端對象,並返回與用戶點擊的任何僞選項卡相對應的輸出上。這是基於Joe Cheng的college scorecard application(只是換出頁錨的查詢字符串)。我寧願不去查詢字符串的路由,因爲這個應用程序通過大量的用戶定義的選擇來源碼更大的數據集,這些選擇必須在URI中進行編碼。由於每次新的搜索都會觸發硬盤頁面刷新,因此每次對輸入進行較小更改時,這可能會導致數據重新加載,預處理等不太好的用戶體驗。
我遇到的問題是,有光澤僅存儲初始 URI在session$clientData
散,有沒有辦法,我發現迫使它來更新(與invalidateLater
,eventReactive
,或observeEvent
)當用戶瀏覽從#summary
到#bleep
到#blorp
。有沒有人遇到過類似的問題?或者是否可以刷新session$clientData
對象而不刷新硬頁?
另一種選擇是向CSS添加一個新類,display: none;
用於隱藏div,並寫一點JS來處理事情。不過,理想情況下,我更願意找到一種基於Shiny的解決方案。
我的代碼類似於:
的index.html:
...
<header role="banner">
<h3 class="usa-display">My header!</h3>
<ul>
<li><a class="nav active" href="#summary">Summary</a></li>
<li><a class="nav" href="#blorp">Another Tab</a></li>
</ul>
</header>
<div data-display-if="output.appMode === 'summary' ">
{{ renderVerbatimText("clientInfo") }}
</div>
<div data-display-if="output.appMode === 'blorp' ">
<img src="assets/img/failWhale.jpg" />
</div>
...
ui.R:
function(req) {
htmlTemplate(
"www/index.html"
)
}
server.R:
parseHashString <- function (str, nested = FALSE) {
if (is.null(str) || nchar(str) == 0) {
values <- "summary"
return(values)
}
if (substr(str, 1, 1) == "#") {
str <- substr(str, 2, nchar(str))
}
values <- strsplit(str, "#", fixed = TRUE)[[1]]
values <- values[!is.na(values)]
values <- values[values %in% c("summary", "blorp")]
return(values[1])
}
shinyServer(function(input, output, session) {
output$appMode <- reactive({
parseHashString(session$clientData$url_hash_initial)
})
outputOptions(output, "appMode", suspendWhenHidden = FALSE)
output$clientInfo<- renderText({
cdata <- session$clientData
cnames <- names(cdata)
allvalues <- lapply(cnames, function(name) {
paste(name, cdata[[name]], sep=" = ")
})
paste(allvalues, collapse = "\n")
})
})