如何在Shiny应用中为RMarkdown生成的PDF页眉左侧添加Logo?路径错误问题求助
解决Shiny中生成PDF时fancyhead找不到图片的问题
这个问题的核心原因很明确:当你在Shiny的downloadHandler里把Rmd文件复制到临时目录后,图片文件并没有跟着复制过去。LaTeX编译PDF时会在Rmd所在的临时目录查找图片,自然找不到留在原项目目录里的rsz_logo_pdf.png,所以抛出了文件未找到的错误。
下面是两种可靠的解决方案:
方案1:将图片复制到临时目录(推荐)
直接在复制Rmd文件的同时,把图片也复制到临时目录,让它和Rmd处于同一层级,这样原Rmd里的相对路径就能正常工作。修改你的app.R中downloadHandler的content函数即可:
server <- function(input, output, session) { output$portfolio_report <- downloadHandler( filename = "report_logo_dev.pdf", content = function(file) { tempReport <- file.path(tempdir(), "report_logo_dev.Rmd") # 复制Rmd文件到临时目录 file.copy("report_logo_dev.Rmd", tempReport, overwrite = TRUE) # 同时复制图片到临时目录 file.copy("rsz_logo_pdf.png", tempdir(), overwrite = TRUE) rmarkdown::render( tempReport , output_file = file , params = params , envir = new.env(parent = globalenv()) ) } ) }
方案2:在Rmd中使用绝对路径
如果你不想复制文件,可以在Rmd里用绝对路径指定图片位置。可以借助here包来获取项目根目录的绝对路径(需要先安装here包),修改Rmd中的\includegraphics行:
\fancyhead[L]{\includegraphics[width=3cm]{`r here::here("rsz_logo_pdf.png")`}}
这种方法不需要修改Shiny代码,但依赖here包对项目结构的识别,在一些复杂部署场景下可能不如方案1稳定。
为什么Shiny外运行正常?
在Shiny环境外直接渲染Rmd时,你的工作目录是项目根目录,Rmd和图片在同一目录,相对路径rsz_logo_pdf.png能正确指向图片文件;但在Shiny中,rmarkdown::render是在临时目录处理复制后的Rmd,此时临时目录里没有图片,自然找不到。
内容的提问来源于stack exchange,提问作者CallumH
相关产品推荐
相关产品推荐

