Shiny Server:编译期间生成可下载的 PDF 失败(代码在本地运行)

Shiny Server: Generating downloadable PDF fails during compilation (code operational locally)

我在远程 Ubuntu 16.04 LTS 平台上托管一个 Shiny 应用程序 ("alpha")。在本地上传 运行 时完全可操作的 Shiny App 目录时,生成 .pdf 功能不起作用。特别是浏览器returns出现如下错误信息;

Firefox can’t find the file at http://IP/alpha/session/88c0e307e045e4b519908a73b85476f4/download/report?w=.

我首先怀疑这是一个用户权限问题,并赋予了 "Shiny" 用户(默认情况下 运行 应用程序在 Ubuntu 上)读写执行权限考虑到 .pdf 生成使用临时文件夹生成报告,到 /tmp/ 文件夹。

sudo setfacl -m 'u:shiny:rwx' /tmp/

不幸的是,问题仍然存在。以下是我的软件包版本:

knitr        "knitr"        "/usr/local/lib/R/site-library" "1.20"
rmarkdown    "rmarkdown"    "/usr/local/lib/R/site-library" "1.10"  
shiny        "shiny"        "/usr/local/lib/R/site-library" "1.1.0"
tinytex      "tinytex"      "/usr/local/lib/R/site-library" "0.8"
/opt/shiny-server/ext/pandoc/pandoc --version pandoc 1.19.2.1

安装Shiny Server时编译Pandoc包,按https://yihui.name/tinytex/.

安装TinyTex包

这是 Shiny Server 生成的错误日志:

Listening on http://127.0.0.1:43458
165: ispresent
164: scatter3D
163: renderPlot [/srv/shiny-server/alpha/server.R#254]
161: func
121: drawPlot
107: <reactive:plotObj>
91: drawReactive
78: origRenderFunc
77: output$dist
1: runApp

processing file: report.Rmd
output file: report.knit.md

sh: 1: pdflatex: not found
Warning: Error in : Failed to compile /tmp/Rtmp25Y4aU/file5bf19f9dd9f.tex. [No stack trace available]

我在下面附加了 downloadHandler。如前所述,它在本地完全可用

output$report = downloadHandler(

                  filename = 'xxx.pdf',

                  content = function(file) {

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

                    # Set up parameters to pass to Rmd document
                    params <- list(mat = allocation_values$rendered[allocation_values$rendered$Allocation > 0])

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

                  })

编辑:添加了 > tinytex::tlmgr_conf()

的输出
=========================== version information ==========================
tlmgr revision 48522 (2018-08-31 06:03:37 +0200)
tlmgr using installation: /root/.TinyTeX
TeX Live (http://tug.org/texlive) version 2018
==================== executables found by searching PATH =================
PATH: /root/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
dvipdfmx:  /root/bin/dvipdfmx
dvips:     0
fmtutil:   /root/bin/fmtutil
kpsewhich: /root/bin/kpsewhich
luatex:    /root/bin/luatex
mktexpk:   /root/bin/mktexpk
pdftex:    /root/bin/pdftex
tex:       0
tlmgr:     /root/bin/tlmgr
updmap:    /root/bin/updmap
xetex:     /root/bin/xetex
=========================== active config files ==========================
Missing argument in sprintf at /root/bin/tlmgr line 6159.
config.ps:        fmtutil.cnf:      /root/.TinyTeX/texmf-dist/web2c/fmtutil.cnf
mktex.cnf:        /root/.TinyTeX/texmf-dist/web2c/mktex.cnf
pdftexconfig.tex: /root/.TinyTeX/texmf-dist/tex/generic/tex-ini-files/pdftexconfig.tex
texmf.cnf:        /root/.TinyTeX/texmf.cnf
texmf.cnf:        /root/.TinyTeX/texmf-dist/web2c/texmf.cnf
updmap.cfg:       /root/.TinyTeX/texmf-dist/web2c/updmap.cfg
============================= font map files =============================
kanjix.map:  /root/.TinyTeX/texmf-var/fonts/map/dvipdfmx/updmap/kanjix.map
pdftex.map:  /root/.TinyTeX/texmf-var/fonts/map/pdftex/updmap/pdftex.map
ps2pk.map:   /root/.TinyTeX/texmf-var/fonts/map/dvips/updmap/ps2pk.map
psfonts.map: /root/.TinyTeX/texmf-var/fonts/map/dvips/updmap/psfonts.map
=========================== kpathsea variables ===========================
ENCFONTS=.:{/usr/share/R/share/texmf,/root/.TinyTeX/texmf-config,/root/.TinyTeX/texmf-var,/root/.TinyTeX/texmf-home,!!/root/texmf-local,!!/root/.TinyTeX/texmf-config,!!/root/.TinyTeX/texmf-var,!!/root/.TinyTeX/texmf-dist}/fonts/enc//
SYSTEXMF=/root/.TinyTeX/texmf-var:/root/texmf-local:/root/.TinyTeX/texmf-dist
TEXCONFIG={/usr/share/R/share/texmf,/root/.TinyTeX/texmf-config,/root/.TinyTeX/texmf-var,/root/.TinyTeX/texmf-home,!!/root/texmf-local,!!/root/.TinyTeX/texmf-config,!!/root/.TinyTeX/texmf-var,!!/root/.TinyTeX/texmf-dist}/dvips//
TEXFONTMAPS=.:{/usr/share/R/share/texmf,/root/.TinyTeX/texmf-config,/root/.TinyTeX/texmf-var,/root/.TinyTeX/texmf-home,!!/root/texmf-local,!!/root/.TinyTeX/texmf-config,!!/root/.TinyTeX/texmf-var,!!/root/.TinyTeX/texmf-dist}/fonts/map/{kpsewhich,pdftex,dvips,}//
TEXMF={/usr/share/R/share/texmf,/root/.TinyTeX/texmf-config,/root/.TinyTeX/texmf-var,/root/.TinyTeX/texmf-home,!!/root/texmf-local,!!/root/.TinyTeX/texmf-config,!!/root/.TinyTeX/texmf-var,!!/root/.TinyTeX/texmf-dist}
TEXMFCONFIG=/root/.TinyTeX/texmf-config
TEXMFDBS={!!/root/texmf-local,!!/root/.TinyTeX/texmf-config,!!/root/.TinyTeX/texmf-var,!!/root/.TinyTeX/texmf-dist}
TEXMFDIST=/root/.TinyTeX/texmf-dist
TEXMFHOME=/root/.TinyTeX/texmf-home
TEXMFLOCAL=/root/texmf-local
TEXMFMAIN=/root/.TinyTeX/texmf-dist
TEXMFSYSCONFIG=/root/.TinyTeX/texmf-config
TEXMFSYSVAR=/root/.TinyTeX/texmf-var
TEXMFVAR=/root/.TinyTeX/texmf-var
TEXPSHEADERS=.:{/usr/share/R/share/texmf,/root/.TinyTeX/texmf-config,/root/.TinyTeX/texmf-var,/root/.TinyTeX/texmf-home,!!/root/texmf-local,!!/root/.TinyTeX/texmf-config,!!/root/.TinyTeX/texmf-var,!!/root/.TinyTeX/texmf-dist}/{dvips,fonts/{enc,type1,type42,type3}}//
VARTEXFONTS=/root/.TinyTeX/texmf-var/fonts
WEB2C={/usr/share/R/share/texmf,/root/.TinyTeX/texmf-config,/root/.TinyTeX/texmf-var,/root/.TinyTeX/texmf-home,!!/root/texmf-local,!!/root/.TinyTeX/texmf-config,!!/root/.TinyTeX/texmf-var,!!/root/.TinyTeX/texmf-dist}/web2c
==== kpathsea variables from environment only (ok if no output here) ====

报错显示找不到pdflatex

sh: 1: pdflatex: not found

tinytex::tlmgr_conf() 的输出中,我们看到 pdftex 安装在 /root 中,即 root 用户的 HOME 目录:

pdftex:    /root/bin/pdftex

看起来您以 root 用户身份执行了 tinytex::install_tinytex()。 运行 Shiny 服务器的 shiny 用户无权访问该目录。您可以像这样为 shiny 用户添加 TinyTeX 安装:

sudo su - shiny
R -e 'tinytex::install_tinytex()'

我不知道是否可以使用 tinytex 进行系统范围的安装。