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
进行系统范围的安装。
我在远程 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
进行系统范围的安装。