1

我目前正在尝试将 R 函数别名pngCairoPNG生成 png 文件。我是从 R 的系统管理员角度出发的——这意味着我没有编写任何 R 代码,也无法更改任何 R 代码。我在弹性 HPC 环境中的管道中运行它。由于环境的性质,我必须在开始时在每个执行节点上安装 X11、cairo 等(这会给每个作业增加 2-3 分钟的任意时间)。

我一直在玩并安装了 R 包Cairo,它可以在没有 X11 转发的情况下生成 png,这正是我所需要的。如果我尝试png默认使用:

cars <- c(1,3,5)
png("cars.png")
Error in png("cars.png") : X11 is not available

我意识到我可以通过在活动会话中分配CairoPNG来规避这一点:png

cars <- c(1,3,5)
png <- CairoPNG
png("cars.png")
plot(cars)

生成一个名为 .png 的文件cars.png。因此,我希望从 .Rprofile 中执行相同的操作,其中依赖的每个 R 脚本png实际上都会在后台使用CairoPNG

在我的 .Rprofile 中,我添加了:

require("Cairo")
png <- CairoPNG

当我通过命令行启动一个新的交互式 R 会话时,我可以看到 Cairo 正在使用,但分配png <- CairoPNG不起作用:

Loading required package: Cairo
> png("cars.png")
Error in png("cars.png") : X11 is not available

任何帮助将不胜感激!

4

1 回答 1

2

添加一条message语句,以便当 R 启动时,我们可以验证 .Rprofile 确实运行了。也使用library代替,require因为library如果它失败,则会在此时给出错误,从而更容易调试。然后,不要将 png 放在全局环境中,而是将其插入 grDevices 命名空间。为此,必须先将其解锁。

# This code goes in .Rprofile file
message("Hello")
library("Cairo")
unlockBinding("png", asNamespace("grDevices"))
utils::assignInNamespace("png", CairoPNG, "grDevices")

对于不同的方法,请查看:

如何在没有 X11 的服务器上运行 R,并避免损坏的依赖关系

于 2020-03-17T20:09:30.367 回答