【问题标题】:Progress bar for kniting documents via shiny通过闪亮编织文档的进度条
【发布时间】:2019-08-23 11:50:41
【问题描述】:

我试图在我闪亮的 downloadHandler() 周围放置一个进度条。进度条应该显示 rmarkdown HTML 的渲染状态

我在 GitHub (https://github.com/rstudio/shiny/issues/1660) 上找到了此信息,但无法使其正常工作。如果我没有定义环境,则无法编织文件。

app.R

library(shiny)
library(rmarkdown)

ui <-  fluidPage(
  sliderInput("slider", "Slider", 1, 100, 50),
  downloadButton("report", "Generate report"),
  textOutput("checkrender")
)
server <-  function(input, output, session) {
  output$checkrender <- renderText({
     if (identical(rmarkdown::metadata$runtime, "shiny")) {
       TRUE
     } else {
       FALSE
     }
  })

  output$report <- downloadHandler(
    filename = "report.html",
    content = function(file) {

      tempReport <- file.path(tempdir(), "report.Rmd")
      file.copy("report.Rmd", tempReport, overwrite = TRUE)

      params <- list(n = input$slider)

      rmarkdown::render(tempReport, 
                        output_file = file,
                        params = params,
                        envir = new.env(parent = globalenv())
      )
    }
  )
}

shinyApp(ui = ui, server = server)

report.Rmd

---
title: "Dynamic report"
output: html_document
params:
  n: NA
---

```{r}
params$n
```

A plot of `params$n` random points.

```{r}
 plot(rnorm(params$n), rnorm(params$n))
```

【问题讨论】:

    标签: r shiny r-markdown


    【解决方案1】:

    您的解决方案非常接近!

    我看到你的代码有两个问题:

    • 您在 downloadHandler 代码中遗漏了 withProgress 调用
    • 测试您是否在闪亮的环境中运行,if (identical(rmarkdown::metadata$runtime, "shiny")),需要进入您的 .Rmd 文件。您在此测试中包含任何增加/设置进度条的调用,否则 .Rmd 代码将产生类似 Error in shiny::setProgress(0.5) : 'session' is not a ShinySession object. 的错误

    下面的代码修改应该可以工作:

    app.R

    library(shiny)
    library(rmarkdown)
    
    ui <-  fluidPage(
      sliderInput("slider", "Slider", 1, 100, 50),
      downloadButton("report", "Generate report"),
      textOutput("checkrender")
    )
    server <-  function(input, output, session) {
      output$checkrender <- renderText({
        if (identical(rmarkdown::metadata$runtime, "shiny")) {
          TRUE
        } else {
          FALSE
        }
      })
    
      output$report <- downloadHandler(
        filename = "report.html",
        content = function(file) {
          withProgress(message = 'Rendering, please wait!', {
            tempReport <- file.path(tempdir(), "report.Rmd")
            file.copy("report.Rmd", tempReport, overwrite = TRUE)
    
            params <- list(n = input$slider)
    
            rmarkdown::render(
              tempReport,
              output_file = file,
              params = params,
              envir = new.env(parent = globalenv())
            )
          })
        }
      )
    }
    
    shinyApp(ui = ui, server = server)
    

    report.Rmd

    ---
    title: "Dynamic report"
    output: html_document
    params:
      n: NA
    ---
    
    ```{r}
    params$n
    
    if (identical(rmarkdown::metadata$runtime, "shiny"))
      shiny::setProgress(0.5)  # set progress to 50%
    ```
    
    A plot of `params$n` random points.
    
    ```{r}
    plot(rnorm(params$n), rnorm(params$n))
    
    if (identical(rmarkdown::metadata$runtime, "shiny"))
      shiny::setProgress(1)  # set progress to 100%
    ```
    

    【讨论】:

    • rmarkdown::metadata$runtime 将仅等于 shiny 如果在 YAML 标头中设置以指定文档本身应作为 Shiny 应用程序 (shiny.rstudio.com/articles/interactive-docs.html) 运行。要检查即使在静态 R 降价文件中 Shiny 是否正在运行,您可以使用 shiny::isRunning()
    • 感谢@HeatherTurner - 用shiny::isRunning() 替换rmarkdown::metadata$runtime 为我修复了它!
    【解决方案2】:

    另一个版本的答案。

    对于rmarkdown 1.14 版,jsavn 的回答似乎不起作用。因为 rmarkdown::metadata 没有 $runtime。 (我试图在rmarkdown::render 渲染期间将rmarkdown::metadata$runtime 的值保存为.rds,但它只有YAML 的值,而metadata$runtime 的值是NULL

    因此,为了允许setProgress 使用“非闪亮”渲染,从闪亮应用传递参数可能是更好的解决方案,因为这将不依赖于元数据的值(可能会随着 rmarkdown 版本的变化而变化)。

    app.R

    library(shiny)
    library(rmarkdown)
    
    ui <-  fluidPage(
      sliderInput("slider", "Slider", 1, 100, 50),
      downloadButton("report", "Generate report")
    )
    server <-  function(input, output, session) {
    
      output$report <- downloadHandler(
        filename = "report.html",
        content = function(file) {
          withProgress(message = 'Rendering, please wait!', {
            tempReport <- file.path(tempdir(), "report.Rmd")
            file.copy("report.Rmd", tempReport, overwrite = TRUE)
    
            params <- list(n = input$slider,
                           rendered_by_shiny = TRUE)
    
            rmarkdown::render(
              tempReport,
              output_file = file,
              params = params,
              envir = new.env(parent = globalenv())
            )
          })
        }
      )
    }
    
    shinyApp(ui = ui, server = server)
    
    

    report.Rmd

    ---
    title: "Dynamic report"
    output: html_document
    params:
      n: 10
      rendered_by_shiny: FALSE
    ---
    
    ```{r}
    params$n
    
    if (params$rendered_by_shiny)
      shiny::setProgress(0.5)  # set progress to 50%
    ```
    
    A plot of `params$n` random points.
    
    ```{r}
    plot(rnorm(params$n), rnorm(params$n))
    
    if (params$rendered_by_shiny)
      shiny::setProgress(1)  # set progress to 100%
    ```
    

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 2019-01-20
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      相关资源
      最近更新 更多