Ссылка на локальный html файл на RMarkdown с Shiny - PullRequest
2 голосов
/ 20 февраля 2020

У меня есть интерактивный документ RMarkdown с блестящим (то есть со строкой runtime: shiny в заголовке YAML) и внутри него я хотел бы создать ссылку на локальный файл html. Но ничего, что я пробовал, пока не работает.

Для примера скажем, у меня есть следующие файлы в моем рабочем каталоге:

  • work_dir /
    • rmarkdown_with_shiny.Rmd
    • блестящий_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") я могу вставить приложение, которое содержит рабочую ссылку (когда приложение запускается отдельно), но как только оно встроено, оно больше не работает. Это код внутри iny_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")). Но в файле rmarkdown с runtime: shiny ни одна из этих функций не работает.

Я был бы очень признателен, если бы кто-нибудь подскажет мне, как связать локальные файлы html в rmarkdown + блестящие файлы. Особенно, если есть способ сделать это, используя блестящие функции, а не синтаксис уценки. Но любое решение приветствуется, если оно создает работающую связь.

1 Ответ

2 голосов
/ 25 февраля 2020

Обычно, когда мы запускаем приложение Shiny, содержимое папки www встроено во внутреннюю структуру, и нам не нужно включать папку www в атрибут href. Но, если мы хотим «выставить» это содержимое через runtime: shiny, нам нужно добавить shiny::addResourcePath() функцию и указать ее папку:

    ---
    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")
    ```

См. здесь для оригинального решения и обсуждения. Кроме того, Ода здесь пакет .

...