Flexdashboard 不适用于 Shiny URL 状态
Posted
技术标签:
【中文标题】Flexdashboard 不适用于 Shiny URL 状态【英文标题】:Flexdashboard doesn't work with Shiny URL state 【发布时间】:2018-04-30 13:10:23 【问题描述】:我正在尝试将 flexdashboard 与 Shiny state 书签结合起来。单独使用时(来自文档的示例)Shiny 应用程序工作正常,但放入 flexdasboard 时,url 不会更新:
---
title: "Untitled"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
runtime: shiny
---
```r setup, include=FALSE
library(flexdashboard)
```
Column data-width=650
-----------------------------------------------------------------------
### Chart A
```r
shinyApp(
ui=function(req)
fluidPage(
textInput("txt", "Text"),
checkboxInput("chk", "Checkbox")
)
,
server=function(input, output, session)
observe(
# Trigger this observer every time an input changes
reactiveValuesToList(input)
session$doBookmark()
)
onBookmarked(function(url)
updateQueryString(url)
)
,
enableBookmarking = "url"
)
```
这甚至可能吗?与独立执行相比:
shinyApp(
ui=function(req)
fluidPage(
textInput("txt", "Text"),
checkboxInput("chk", "Checkbox")
)
,
server=function(input, output, session)
observe(
# Trigger this observer every time an input changes
reactiveValuesToList(input)
session$doBookmark()
)
onBookmarked(function(url)
updateQueryString(url)
)
,
enableBookmarking = "url"
)
它看起来像 onBookmarked
(以及类似的事件,如 onBookmark
、onRestore
和 onRestored
)从未被触发。
【问题讨论】:
【参考方案1】:嵌入在 R Markdown 文档中的 Shiny 应用程序不支持书签。
在此处查看讨论:https://github.com/rstudio/shiny/pull/1209#issuecomment-227207713
听起来在技术上是可行的,但很难做到。例如,如果文档中嵌入了多个应用程序会怎样?此外,应用程序作为 iframe 嵌入,因此必须进行一些连接以允许这些应用程序访问/修改其父窗口的 URL。
但是,书签确实适用于嵌入式 Shiny 组件(而不是完整的应用程序)。
---
title: "Untitled"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
runtime: shiny
---
```r setup, include=FALSE
knitr::opts_chunk$set(echo = FALSE)
enableBookmarking("url")
```
```r, include=FALSE
observe(
reactiveValuesToList(input)
session$doBookmark()
)
onBookmarked(function(url)
updateQueryString(url)
)
output$content <- renderUI(
tagList(
textInput("txt", "Text"),
checkboxInput("chk", "Checkbox")
)
)
```
Column data-width=650
-----------------------------------------------------------------------
### Chart A
```r
fluidPage(
uiOutput("content"),
selectInput("sel", label = "Select", choices = c(10, 20, 30), selected = 10)
)
```
您也可以使用Prerendered Shiny Documents,尽管由于 UI 是预渲染的,因此书签的工作方式不会 100% 相同。任何静态 UI 都必须使用 bookmarking callbacks 手动恢复,但动态 UI 可以很好地恢复。
---
title: "Untitled"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
runtime: shiny_prerendered
---
```r setup, include=FALSE
knitr::opts_chunk$set(echo = FALSE)
enableBookmarking("url")
```
```r, context="server"
observe(
reactiveValuesToList(input)
session$doBookmark()
)
onBookmarked(function(url)
updateQueryString(url)
)
# Static inputs are pre-rendered, and must be manually restored
onRestored(function(state)
updateSelectInput(session, "sel", selected = state$input$sel)
)
# Dynamic inputs will be restored with no extra effort
output$content <- renderUI(
tagList(
textInput("txt", "Text"),
checkboxInput("chk", "Checkbox")
)
)
```
Column data-width=650
-----------------------------------------------------------------------
### Chart A
```r
fluidPage(
uiOutput("content"),
selectInput("sel", label = "Select", choices = c(10, 20, 30), selected = 10)
)
```
【讨论】:
以上是关于Flexdashboard 不适用于 Shiny URL 状态的主要内容,如果未能解决你的问题,请参考以下文章
R + Shiny 哪个锤子?直的 Shiny、flexdashboard 还是 shinydashboard? [关闭]
使用 Flexdashboard 部署 Shiny 应用程序
在 Rmarkdown 中使用 Shiny 创建响应式 selectInput - flexdashboard
selectInput 选择依赖于 R Shiny Flexdashboard 的另一个 selectInput