我的最终目标是在我大学的 Linux 服务器上呈现 R Markdown 文档,该服务器使用 SLURM 进行队列管理。但是,使用 PNG 图形设备会产生错误,而 PDF 图形设备会提供不适当的输出。
请注意,我有一台 Windows 计算机,并且正在使用 PuTTY 与服务器通信。 Xming 已安装,PuTTY 已启用 X11 转发。
当我运行时
salloc --ntasks 1 --partition <partition_name>
srun Rscript -e "png('test.png'); plot(1,1); dev.off()"`
没有保存绘图,我收到以下警告消息:
1: In png("test.png") :
unable to load shared object '/opt/exp_soft/R- 3.5.2/lib64/R/library/grDevices/libs//cairo.so': /lib64/libcairo.so.2: undefined symbol: FT_Get_Var_Design_Coordinates
2: In png("test.png") : 加载cairo DLL失败
空设备
但是,当我只删除 srun
命令并运行时
salloc --ntasks 1 --partition <partition_name>
srun Rscript -e "png('test.png'); plot(1,1); dev.off()"`
然后保存文件test.png
。此外,输出 PDF 而不是 PNG 也能正确生成绘图 (Rscript -e "pdf( 'test.pdf'); plot(1,1); dev.off()"
) .
同理,一开始不使用srun
,使用Rscript -e "('test.Rmd')"
渲染Rmd文档,会正确渲染Rmd医生。但是把 srun
放在开头不会生成 Rmd 文档,只会生成警告信息:
File test2_files/figure-html/unnamed-chunk-1-1.svg not found in resource path
Error: pandoc document conversion failed with error 99
In addition: Warning messages:
1: In grDevices::png(f) : unable to load shared object '/opt/exp_soft/R-3.5.2/lib64/R/library/grDevices/libs//cairo.so': /lib64/libcairo.so.2: undefined symbol: FT_Get_Var_Design_Coordinates
2: In grDevices::png(f) : failed to load cairo DLL
3: In (function (filename = if (onefile) "Rplots.svg" else "Rplot%03d.svg", : failed to load cairo DLL
Execution halted
srun: error: srvcnthpc100: task 0: Exited with exit code 1
如果我将 dev='pdf'
设置为 knitr block 选项,则会呈现 Rmd 文档,但 html 文档中的绘图非常奇怪,因为它有一个滚轮和一个灰色背景(dev_equals_png_rmd_output)。
我注意到上述错误消息“FT_Get_Var_Design_Coordinates”中的“ undefined symbol ”是 FreeType 库的一部分。但是,我不确定这可能意味着什么,或者如果它意味着什么我会怎么做。
我重新安装了 Cairo
R 包,但这并没有改变错误消息。
由于 PNG 图像呈现在头节点上(即没有 srun
)而不是在服务器节点上(即有 srun
),所以在我看来R
、SLURM
和服务器节点之间的通信中断,而不是某些文件或程序丢失。
我还认为 pandoc
会抛出错误,因为运行 R
代码时未生成 png 图像。
请注意,当使用 sbatch
而不是 srun
时也会产生上述错误(即代码以批处理而不是交互模式运行)。
任何帮助将不胜感激!我刚开始使用 Linux,并且开始喜欢上它了!
在服务器上运行 Rscript -e "sessionInfo()"
产生:
R version 3.5.2 (2018-12-20)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)
Matrix products: default BLAS: /usr/lib64/libblas.so.3.4.2 LAPACK: /usr/lib64/liblapack.so.3.4.2
locale:
1 LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages: 1 stats graphics grDevices utils datasets methods base
other attached packages: 1 rmarkdown_1.11
loaded via a namespace (and not attached): 1 compiler_3.5.2 tools_3.5.2 htmltools_0.3.6 Rcpp_1.0.0 [5] knitr_1.21 xfun_0.5 digest_0.6.18 evaluate_0.13
当我运行 Rscript -e capabilities()
时,我得到以下信息:
jpeg png tiff tcltk X11 aqua
TRUE TRUE TRUE TRUE TRUE FALSE
http/ftp sockets libxml fifo cledit iconv
TRUE TRUE TRUE TRUE FALSE TRUE
NLS profmem cairo ICU long.double libcurl
TRUE FALSE TRUE TRUE TRUE TRUE
最佳答案
所以,问题确实出在 FreeType 上。以前的 FreeType 库坏了(不确定具体是什么意思,但系统管理员是这么说的),系统管理员推出了更新和修复的 FreeType。然而,他一不小心只在头节点和他测试的服务器节点上做了这个。一旦他更新了整个集群,代码就按预期运行了。直接的 PNG 图和渲染带有图形的 Rmd 文档都工作正常。
关于r - PNG 图像在 linux 服务器节点上但不在头节点上时生成错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54987284/