从闪亮的应用程序创建 pdf 时,knitr 找不到 pdflatex

knitr cannot find pdflatex when creating pdf from shiny app

我正在尝试创建一个闪亮的应用程序,为用户提供从反应呈现的数据库中选择的罐头报告,然后为用户提供下载他们想要的报告的 pdf 的选项。我 运行 很难让 knitr 发现 pdflatex 来制作 pdf。我最初尝试使用 MikTex,但在其他帖子的建议下删除了 MikTex 并改为使用 tinytex。我遵循了此处的指导:https://yihui.org/tinytex/r/#debugging。闪亮的应用程序运行良好,但是当我单击下载按钮时,R 最初开始编译过程,但是一旦我在对话框按钮启动时单击保存,R 就会抛出此错误(我包括 Yuhui Xie 建议的详细输出 - the tinytex 包作者):

processing file: Reports.Rmd
  |..................                                                      |  25%
  ordinary text without R code

  |....................................                                    |  50%
label: unnamed-chunk-1
  |......................................................                  |  75%
  ordinary text without R code

  |........................................................................| 100%
label: unnamed-chunk-2

output file: Reports.knit.md

"C:/Program Files/RStudio/bin/pandoc/pandoc" +RTS -K512m -RTS Reports.utf8.md --to latex --from markdown+autolink_bare_uris+tex_math_single_backslash --output pandoc5ac42d2964ee.tex --lua-filter "C:\Users\SCMCKENZIE\Documents\R\win-library.0\rmarkdown\rmarkdown\lua\pagebreak.lua" --lua-filter "C:\Users\SCMCKENZIE\Documents\R\win-library.0\rmarkdown\rmarkdown\lua\latex-div.lua" --self-contained --highlight-style tango --pdf-engine xelatex --variable graphics --variable "geometry:margin=1in" 
Warning: Error in : LaTeX failed to compile C:\Users\SCMCKE~1\AppData\Local\Temp\Rtmp0a6jRk\file5ac45df413ce.tex. See https://yihui.org/tinytex/r/#debugging for debugging tips.
  [No stack trace available]

这是我的 SessionInfo()

R version 4.0.2 (2020-06-22)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19041)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] plyr_1.8.6           rmarkdown_2.6        knitr_1.29          
 [4] tmap_3.3             rgeos_0.5-3          sp_1.4-1            
 [7] sf_0.9-7             xtable_1.8-4         readr_1.4.0         
[10] shinydashboard_0.7.1 odbc_1.2.3           DBI_1.1.0           
[13] shiny_1.5.0         

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.5         lattice_0.20-41    png_0.1-7          class_7.3-17      
 [5] digest_0.6.25      mime_0.9           R6_2.4.1           evaluate_0.14     
 [9] e1071_1.7-3        pillar_1.4.6       rlang_0.4.7        rstudioapi_0.11   
[13] raster_3.3-13      blob_1.2.1         stringr_1.4.0      htmlwidgets_1.5.1 
[17] bit_1.1-15.2       tinytex_0.29       compiler_4.0.2     httpuv_1.5.4      
[21] xfun_0.20          pkgconfig_2.0.3    tmaptools_3.1-1    base64enc_0.1-3   
[25] htmltools_0.5.0    tidyselect_1.1.0   tibble_3.0.3       codetools_0.2-16  
[29] XML_3.99-0.4       viridisLite_0.3.0  crayon_1.3.4       dplyr_1.0.0       
[33] later_1.1.0.1      grid_4.0.2         jsonlite_1.7.0     lwgeom_0.2-5      
[37] lifecycle_0.2.0    magrittr_1.5       units_0.6-7        KernSmooth_2.23-17
[41] stringi_1.4.6      promises_1.1.1     leafsync_0.1.0     leaflet_2.0.4.1   
[45] ellipsis_0.3.1     generics_0.0.2     vctrs_0.3.2        RColorBrewer_1.1-2
[49] tools_4.0.2        dichromat_2.0-0    bit64_0.9-7        leafem_0.1.3      
[53] glue_1.4.1         purrr_0.3.4        hms_0.5.3          crosstalk_1.1.0.1 
[57] abind_1.4-5        parallel_4.0.2     fastmap_1.0.1      yaml_2.2.1        
[61] stars_0.5-1        classInt_0.4-3   

我已确保在 RStudio 中选择了我的全局选项以使用 knitr 和 pdflatex。 Sys.which('pdflatex') 给我:

         pdflatex 
"C:\Users\SCMCKE~1\AppData\Roaming\TinyTeX\bin\win32\pdflatex.exe"  

tinytex::tlmgr_conf() 给我:

tlmgr conf
=========================== version information ==========================
tlmgr revision 57424 (2021-01-15 03:30:58 +0100)
tlmgr using installation: C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX
TeX Live (https://tug.org/texlive) version 2020
==================== executables found by searching PATH =================
PATH: C:\Users\SCMCKE~1\AppData\Roaming\TinyTeX\tlpkg\tlperl\bin;C:\Users\SCMCKE~1\AppData\Roaming\TinyTeX\bin\win32;C:\rtools40\usr\bin;C:\Program Files\R\R-4.0.3\bin\x64;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Program Files\Microsoft MPI\Bin\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Microsoft SQL Server0\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server0\Tools\Binn\;C:\Program Files\Microsoft SQL Server0\Tools\Binn\;C:\Program Files\Microsoft SQL Server0\DTS\Binn\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC0\Tools\Binn\;C:\Program Files\Microsoft SQL Server0\Tools\Binn\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Users\SCMCKENZIE\AppData\Roaming\TinyTeX\bin\win32;C:\Users\SCMCKENZIE\AppData\Local\Microsoft\WindowsApps;C:\Users\SCMCKENZIE\AppData\Local\Programs\MiKTeX\miktex\bin\x64
dvipdfmx:  C:/Users/SCMCKE~1/AppData/Roaming/TinyTeX/bin/win32/dvipdfmx.EXE
dvips:     C:/Users/SCMCKE~1/AppData/Roaming/TinyTeX/bin/win32/dvips.EXE
fmtutil:   C:/Users/SCMCKE~1/AppData/Roaming/TinyTeX/bin/win32/fmtutil.EXE
kpsewhich: C:/Users/SCMCKE~1/AppData/Roaming/TinyTeX/bin/win32/kpsewhich.EXE
luatex:    C:/Users/SCMCKE~1/AppData/Roaming/TinyTeX/bin/win32/luatex.EXE
mktexpk:   C:/Users/SCMCKE~1/AppData/Roaming/TinyTeX/bin/win32/mktexpk.EXE
pdftex:    C:/Users/SCMCKE~1/AppData/Roaming/TinyTeX/bin/win32/pdftex.EXE
tex:       C:/Users/SCMCKE~1/AppData/Roaming/TinyTeX/bin/win32/tex.EXE
tlmgr:     C:/Users/SCMCKE~1/AppData/Roaming/TinyTeX/bin/win32/tlmgr.BAT
updmap:    C:/Users/SCMCKE~1/AppData/Roaming/TinyTeX/bin/win32/updmap.EXE
xetex:     C:/Users/SCMCKE~1/AppData/Roaming/TinyTeX/bin/win32/xetex.EXE
=========================== active config files ==========================
config.ps:        c:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist/dvips/config/config.ps
fmtutil.cnf:      c:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist/web2c/fmtutil.cnf
mktex.cnf:        c:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist/web2c/mktex.cnf
pdftexconfig.tex: c:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist/tex/generic/tex-ini-files/pdftexconfig.tex
texmf.cnf:        c:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf.cnf
texmf.cnf:        c:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist/web2c/texmf.cnf
updmap.cfg:       c:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist/web2c/updmap.cfg
============================= font map files =============================
kanjix.map:  c:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var/fonts/map/dvipdfmx/updmap/kanjix.map
pdftex.map:  c:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var/fonts/map/pdftex/updmap/pdftex.map
ps2pk.map:   c:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var/fonts/map/dvips/updmap/ps2pk.map
psfonts.map: c:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var/fonts/map/dvips/updmap/psfonts.map
=========================== kpathsea variables ===========================
ENCFONTS=.;{C:/PROGRA~1/R/R-40~1.2/share/texmf,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist}/fonts/enc//
SYSTEXMF=C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var;C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local;C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist
TEXCONFIG={C:/PROGRA~1/R/R-40~1.2/share/texmf,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist}/dvips//
TEXFONTMAPS=.;{C:/PROGRA~1/R/R-40~1.2/share/texmf,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist}/fonts/map/{kpsewhich,pdftex,dvips,}//
TEXMF={C:/PROGRA~1/R/R-40~1.2/share/texmf,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist}
TEXMFCONFIG=C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config
TEXMFDBS={!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist}
TEXMFDIST=C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist
TEXMFHOME=C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local
TEXMFLOCAL=C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local
TEXMFMAIN=C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist
TEXMFSYSCONFIG=C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config
TEXMFSYSVAR=C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var
TEXMFVAR=C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var
TEXPSHEADERS=.;{C:/PROGRA~1/R/R-40~1.2/share/texmf,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist}/{dvips,fonts/{enc,type1,type42,type3}}//
VARTEXFONTS=C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var/fonts
WEB2C={C:/PROGRA~1/R/R-40~1.2/share/texmf,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var,C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-local,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-config,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-var,!!C:/Users/SCMCKENZIE/AppData/Roaming/TinyTeX/texmf-dist}/web2c
==== kpathsea variables from environment only (ok if no output here) ====

如果这是我的编码问题,下面是一个可重现的 R 脚本:

##Loading Necessary Packages
library(shiny)
library(shinydashboard)
library(rmarkdown)
library(knitr)
library(plyr)

##Getting data for reproducibility
data("iris")
data("airquality")
names(airquality)[5]<-"Species"#To allow for using the same plyr code in server function on both data sets

####Creating Shiny App####
##User Interface
ui<-dashboardPage(
  dashboardHeader(title="FAKE SHINY APPLICATION"),
  dashboardSidebar(
    sidebarMenu(tabName="REPORTS",
      menuItem("OPTIONS", tabName = "SOME MENU OPTIONS",
                         radioButtons(inputId = "REPORT", label = "Select Something", choices = c("Iris", "AQ")),
                         downloadButton(outputId = "DWNLD", "Download Report")
    )
    )
  ),
  dashboardBody(
    tableOutput(outputId = "TABLE"),
    plotOutput(outputId = "PLOT")
  )
)


##Server Function##
server<-function(input, output){

##Reactive Plot##  
output$PLOT<-renderPlot({
    RPT<-list(Iris = iris, AQ = airquality)
    DF<-RPT[[input$REPORT]]
    pairs(DF[,c(1:4)])})

##Reactive Table##  
  output$TABLE<-renderTable({
    RPT<-list(Iris = iris, AQ = airquality)
    DF<-RPT[[input$REPORT]]
    rpt_tbl<-ddply(DF, "Species", colwise(mean))
    xtable(rpt_tbl)
  })

##Download As PDF##
  
  output$DWNLD<-downloadHandler(
    filename=paste(input$REPORT, "pdf", sep="."),
    content<-function(file){
      RPT<-list(iris, airquality)
      names(RPT)<-c("Iris", "AQ")
     
      tmp<-file.path(tempdir(), "Reports.Rmd")
      file.copy(paste(getwd(),"Reports.Rmd", sep="/"), tmp, overwrite=TRUE)
      params<-list(DF
      rmarkdown::render(tmp, output_file = file,
                        params = params,
                        envir = new.env(parent = globalenv()
                        ))#End render
    }
  )
}

##Launch Shiny App##
shinyApp(ui=ui, server = server)

这里是保存为 Reports.Rmd:

的 Rmarkdown 文档的脚本
---
title: "FAKE REPORT"
output: pdf_document
params:
  DF: NA
---

Fake Report Output

```{R}
rpt_tbl<-ddply(params$DF, "Species", colwise(mean))
xtable(rpt_tbl)
```

More Fake Output

```{R}
pairs(params$DF[,c(1:4)])
```

我搜索了 Stack Overflow 和 RStudio 的答案,但没有发现任何似乎是我的问题。我的一部分想知道这是否是平台问题。任何帮助将非常感激。非常感谢。 小心, -肖恩

经过大量搜索和测试后,我发现问题不在于 tinytex 或 pdflatex,而是我对 rmarkdown::render() 的调用导致我在 GitHub [=16= 上找到了这个答案].显然,当在 downloadHandler() 中调用 rmarkdown::render() 时,您不应在 render() 中指定 output_file 参数,而是需要在渲染后重命名文件。

这是正确的代码(只需替换我原来问题中脚本中对 downloadHandler() 的调用即可。

  output$DWNLD<-downloadHandler(
    
    filename=paste0(input$REPORT, ".pdf"),
    
    content<-function(file){
      RPT<-list(iris, airquality)
      names(RPT)<-c("Iris", "AQ")
      
      tmp <- file.path(tempdir(), "Reports.Rmd", fsep="\")
      file.copy("F:/Apps/DNR_TRIS/Shiny_report_scripts/SQL_SCRIPTS/Reports.Rmd", tmp, overwrite = TRUE)
      out<-RPT[[input$REPORT]]
      params<-list(out)
      names(params)<-"DF"
      
      out<-rmarkdown::render(tmp,
                        params = params,
                        envir = new.env(parent = globalenv()
                        ))#End render
      file.rename(out, file)
    }
  )