使用 Shiny 链接到 RMarkdown 上的本地 html 文件
Posted
技术标签:
【中文标题】使用 Shiny 链接到 RMarkdown 上的本地 html 文件【英文标题】:Link to a local html file on RMarkdown with Shiny 【发布时间】:2020-06-05 04:15:22 【问题描述】:我有一个带有闪亮的交互式 RMarkdown 文档(即在 YAML 标头中使用 runtime: shiny
行),在其中我想创建一个指向本地 html 文件的链接。但到目前为止我没有尝试过任何工作。
为了举例,假设我的工作目录中有以下文件:
work_dir/ rmarkdown_with_shiny.Rmd shiny_app.R www/ my_file.html我想要做的是在 rmarkdown_with_shiny.Rmd 中创建一个链接,单击该链接会打开文件 www/my_file.html。
文件 rmarkdown_with_shiny.Rmd 中的代码如下,包括我尝试过的所有内容,但到目前为止没有任何效果:
---
title: "Rmarkdown with shiny"
output: html_document
runtime: shiny
---
[link_1](www/my_file.html)
[link_2](my_file.html)
[link_3](file://www/my_file.html)
```r shiny_links, echo=F, eval=T
renderUI(tags$a("link_4", href="my_file.html", target="_blank"))
renderUI(tags$a("link_5", href="www/my_file.html", target="_blank"))
renderUI(tags$a("link_6", href="file://www/my_file.html", target="_blank"))
shinyAppFile("shiny_app.R")
```
使用最后一行shinyAppFile("shiny_app.R")
我可以嵌入一个包含工作链接的应用程序(当应用程序单独运行时),但一旦嵌入它就不再工作了。这是shiny_app.R里面的代码:
library('shiny')
ui <- fluidPage(
htmlOutput("link")
)
server <- function(input, output)
output$link <- renderUI(tags$a("single_link", href="my_file.html", target="_blank"))
shinyApp(ui = ui, server = server)
令人困惑的部分是这条线[link_1](www/my_file.html)
如果它只是没有闪亮的 rmarkdown 就可以工作。如果它只是一个闪亮的应用程序renderUI(tags$a("single_link", href="my_file.html", target="_blank"))
,这条线就可以工作。但是在带有runtime: shiny
的 rmarkdown 文件中,这些都不起作用。
如果有人能告诉我如何在 rmarkdown + 闪亮文件中链接本地 html 文件,我将不胜感激。特别是如果有办法使用闪亮的函数而不是降价语法来做到这一点。但无论哪种解决方案都受到欢迎,只要它可以创建有效的链接。
【问题讨论】:
我知道您说文件名为rmarkdown_with_shiny.Rmd
,但只是想检查一下它是否绝对正确。当文件名包含空格时,我遇到了runtime: shiny
的一些奇怪行为。所以我的建议是确保文件名中没有空格或非 ascii 字符。
是的,文件名只包含字母和下划线,就是rmarkdown_with_shiny.Rmd
。没有空格或非 ASCII 字符。
【参考方案1】:
基本上,当我们运行 Shiny 应用程序时,www
文件夹的内容是在内部嵌入的,我们不需要将 www
文件夹包含到 href
属性中。
但是,如果我们想通过 runtime: shiny
“公开”这些内容,我们需要添加 shiny::addResourcePath()
function 并指定其文件夹:
---
title: "Rmarkdown with shiny"
output: html_document
runtime: shiny
---
```r setup, include = FALSE
library(knitr)
library(shiny)
library(here)
shiny::addResourcePath(prefix = "www", directoryPath = here::here("www"))
```
Relative File Path: [My HTML file](www/my_file.html)
Relative File Path: <a href = "www/my_file.html" target="_blank">My HTML file</a>
Absolute File Path: <a href = "http://www.shinyapps.io/" target="_blank">shinyapps.io</a>
Relative File Path:
```r shiny-relative-links, echo = FALSE, eval = TRUE
tags$a(href = "www/my_file.html",
tags$span(style = "color: #03a9f4", "My HTML file"),
target = "_blank")
```
Absolute File Path:
```r shiny-absolute-links, echo = FALSE, eval = TRUE
tags$a(href = "http://www.shinyapps.io/",
tags$span(style = "color: #03a9f4", "shinyapps.io"),
target = "_blank")
```
有关原始解决方案和讨论,请参阅 here。另外,Ode to the here package。
【讨论】:
以上是关于使用 Shiny 链接到 RMarkdown 上的本地 html 文件的主要内容,如果未能解决你的问题,请参考以下文章
使用基于 selectInput 的动态参数将绘图从 rmarkdown 复制到 Shiny 的问题
如何在 RMarkdown 中使用 Shiny 进行嵌套选择 selectInput()?
改变图形大小(Rstudio、Rmarkdown、Shiny)