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(以及类似的事件,如 onBookmarkonRestoreonRestored)从未被触发。

【问题讨论】:

【参考方案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

Shiny flexdashboard 中的 facet_grid 给出错误“构面变量必须至少有一个值”

如何使 Shiny 的 input$var 可用于 dplyr::summarise()