代码之家  ›  专栏  ›  技术社区  ›  j_random_hacker

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

  •  4
  • j_random_hacker  · 技术社区  · 5 年前

    特别是我想跑 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 string invalid 'filename' argument ,这分别符合这些职能的官方文件。

    read.table() 函数从标准输入读取,我希望有办法。我在这里找不到任何相关的东西所以通过搜索 [r] stdout plot stdout 替换为 "standard output" (带或不带双引号),和/或 plot 替换为 png

    2 回复  |  直到 5 年前
        1
  •  5
  •   Konrad Rudolph    5 年前

    解决这个问题的明显方法是:让图形设备写入临时文件,然后将该临时文件读回R会话并将其写入stdout。

    readBin 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)
    }
    
        2
  •  1
  •   A. Stam    5 年前

    这可能不是一个完整的答案,但这是我得到的最好的答案:能否使用 stdout() 命令?我知道 png() png 通过 stdout . 然而,我对标准输出的了解还不足以检验这一理论。

    这个 help page 建议此连接可能只是文本连接。在这种情况下,解决方案可能是生成一个随机字符串作为文件名,并将文件名传递给