gpt4 book ai didi

r - 以位图格式(例如 PNG)将绘图写入标准输出

转载 作者:行者123 更新时间:2023-12-05 00:11:12 25 4
gpt4 key购买 nike

是否可以让 R 以位图格式(例如 PNG)将绘图写入标准输出?如果是这样,如何?

具体我想运行 Rscript myscript.R | other_prog_that_reads_a_png_from_stdin .我意识到可以创建一个临时文件并使用它,但这很不方便,因为可能同时运行该管道的许多副本,因此需要选择唯一文件名并在之后删除它们的方案。

到目前为止,我已经尝试设置 outf <- file("stdout")然后运行 ​​bitmap(file=outf, ...)png(filename=outf, ...) ,但两者都提示(分别为 'file' must be a non-empty character stringinvalid 'filename' argument ),这与这些函数的官方文档一致。

因为我能说服R的read.table()从标准输入读取的函数,我希望有办法。通过搜索 [r] stdout plot,我无法在 SO 上找到任何相关内容。 ,或与 stdout 的任何变体替换为 "standard output" (带或不带双引号),和/或 plot替换为 png .

谢谢!

最佳答案

不幸的是,{grDevices}(以及暗示的 {ggplot2})似乎根本不支持这一点。

解决此问题的显而易见的方法是:让图形设备写入临时文件,然后将该临时文件读回 R session 并将其写入标准输出。

但这失败了,因为一方面,无法将数据读入字符串:R 中的字符串不支持嵌入的空字符(如果您尝试,您将收到诸如“不允许使用空字符”之类的错误)。另一方面,readBinwriteBin失败,因为 writeBin断然拒绝写入任何连接到 stdout 的设备,该设备处于文本模式(忽略在 POSIX 系统上,两者是相同的事实)。

这只能以令人难以置信的骇人听闻的方式来规避,例如by opening a binary pipe to a command such as cat :

dev_stdout = function (underlying_device = png, ...) {
filename = tempfile()
underlying_device(filename, ...)
filename
}

dev_stdout_off = function (filename) {
dev.off()
on.exit(unlink(filename))
fake_stdout = pipe('cat', 'wb')
on.exit(close(fake_stdout), add = TRUE)
writeBin(readBin(filename, 'raw', file.info(filename)$size), fake_stdout)
}

要使用它:
tmp_dev = dev_stdout()
contour(volcano)
dev_stdout_off(tmp_dev)

/dev/stdout 的系统上存在(大多数但不是全部 POSIX 系统), dev_stdout_off通过删除命令重定向,可以稍微简化函数:
dev_stdout_off = function (filename) {
dev.off()
on.exit(unlink(filename))
fake_stdout = file('/dev/stdout', 'wb')
on.exit(close(fake_stdout), add = TRUE)
writeBin(readBin(filename, 'raw', file.info(filename)$size), fake_stdout)
}

关于r - 以位图格式(例如 PNG)将绘图写入标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54309405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com