在 pdf 输出的 header 中渲染 logo.png 有光泽 - Rmarkdown

Render logo.png in header of pdf output shiny - Rmarkdown

这是对这个问题的后续或更多的简化 Error: File header.tex not found in resource path in a rmarkdown generated pdf report from a shiny app

使用这个 Rmarkdown 代码我可以实现我想要的:

logo.png

report.Rmd

---
geometry: margin=20truemm
fontfamily: mathpazo
fontsize: 11pt
documentclass: article
classoption: a4paper
urlcolor: blue
output: 
    pdf_document:
header-includes:
   - \usepackage{fancyhdr}
   - \pagestyle{fancy}
   - \rhead{\includegraphics[width = .05\textwidth]{logo.png}}
params: 
    scores: NA
---
<!-- ```{r, echo=FALSE} -->
<!-- hist(params$scores) -->
<!-- ``` -->

```{r}
hist(runif(100))
```

获得所需的输出:R 标志位于 header:

现在我想在闪亮的应用程序中做同样的事情

为此,我将绘图作为 参数 传递,并取消注释 report.Rmd 文件中的相关部分

report.Rmd文件中的相关部分:

```{r, echo=FALSE}
hist(params$scores)
```

app.R

# Global variables can go here
n <- 200


# Define the UI
ui <- bootstrapPage(
  numericInput('n', 'Number of obs', n),
  plotOutput('plot'),
  downloadButton('report', 'Generate Report')
)


# Define the server code
server <- function(input, output) {
  output$plot <- renderPlot({
    hist(runif(input$n))
  })
  
  # create markdown report  ----------------------------------
  
  output$report <- downloadHandler(
    filename = "report.pdf",
    content = function(file) {
      tempReport <- file.path(tempdir(), "report.Rmd")
      file.copy("report.Rmd", tempReport, overwrite = TRUE)
      
      params <- list(scores = input$n)
      
      rmarkdown::render(tempReport, output_file = file,
                        params = params,
                        envir = new.env(parent = globalenv())
      )
    }
  )
  
}

# Return a Shiny app object
shinyApp(ui = ui, server = server)

错误:

! Package pdftex.def Error: File `logo.png' not found: using draft setting.

我怀疑是因为它在本地工作 logo.png 在 shiny 保存 tempReport 的临时文件中找不到

但我不知道为什么这在从降价编织时有效,而不是在从闪亮的应用程序中调用它时有效。 我想我已经浏览过互联网上的相关网站了! 非常感谢!

基本上你已经知道问题出在哪里了。因此,解决问题的一种方法是将报告模板和徽标复制到同一临时目录。

# Define the server code
server <- function(input, output) {
  output$plot <- renderPlot({
    hist(runif(input$n))
  })
  # create markdown report  ----------------------------------
  output$report <- downloadHandler(
    filename = "report.pdf",
    content = function(file) {
      td <- tempdir()
      tempReport <- file.path(td, "report.Rmd")
      tempLogo <- file.path(td, "logo.png")
      file.copy("report.Rmd", tempReport, overwrite = TRUE)
      file.copy("logo.png", tempLogo, overwrite = TRUE)

      params <- list(scores = input$n)

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