gpt4 book ai didi

r - 管道 Rscript 在输出后出错

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

我写了一个小的 R 脚本来读取 JSON,它工作正常,但在使用管道时

Rscript myscript.R | head

(完整的,预期的)输出返回错误
Error: ignoring SIGPIPE signal
Execution halted

奇怪的是,我无法通过使用以下命令将 STDERR 传送到 /dev/null 来删除它:
Rscript myscript.R | head 2>/dev/null

给出了相同的错误......大概是因为错误出现在 Rscript 命令中?给我的建议是 head 命令的输出都是 STDOUT。
  • 管道 STDOUT 到 /dev/null 仅返回错误消息
  • 管道 STDERR 到 /dev/null 仅返回错误消息...!

  • 将输出管道输出到 cat 似乎是“不可见的”——这不会导致错误。
    Rscript myscript.R | cat | head

    在 cat 命令之后可以进行进一步的管道链接,但感觉我可能因为不解决错误而忽略了一些重要的事情。

    我需要在脚本中使用一个设置来允许管道没有错误吗?我想让 R 脚本为小任务做好准备,就像 Python 和 Perl 一样,总是不得不添加一个无用的 cat 会很烦人。

    有关于在 C here 中处理此错误的讨论,但我并不清楚这与 R 脚本有何关联。

    编辑 为了回应@lll 的回答,使用的完整脚本(上面称为“myscript.R”)是
    library(RJSONIO)
    note.list <- c('abcdefg.json','hijklmn.json')
    # unique IDs for markdown notes stored in JSON by Laverna, http://laverna.cc
    for (laverna.note in note.list) {
    # note.file <- path.expand(file.path('~/Dropbox/Apps/Laverna/notes',
    # laverna.note))
    # For the purpose of this example run the script in the same
    # directory as the JSON files
    note.file <- path.expand(file.path(getwd(),laverna.note))
    file.conn <- file(note.file)
    suppressWarnings( # warnings re: no terminating newline
    cat(paste0(substr(readLines(file.conn), 2, 15)),'\n') # add said newline
    )
    close(file.conn)
    }
    Rscript myscript.R 输出
    "id":"abcdefg"
    "id":"hijklmn"
    Rscript myscript.R | head -1 输出
    "id":"abcdefg" 
    Error: ignoring SIGPIPE signal
    Execution halted

    我不清楚什么会在这里“提前”终止

    编辑 2 它可以用 readLines 复制,所以我在上面的例子中删除了 JSON 库特定的细节。脚本和虚拟 JSON 为 here

    编辑 3 似乎可以采用包括管道在内的命令行参数并将它们传递给 pipe() - 我会尽可能尝试并解决问题。

    最佳答案

    该错误只是由尝试在没有连接到另一端的进程的情况下写入管道引起的。换句话说,当到达管道和 HEAD 时,您的脚本已经拿起并离开了。命令被调用。

    命令本身可能不是问题;它可能是脚本中的某些内容,导致在到达管道之前提前终止或竞争条件。由于您获得了完整的输出,因此可能不是那么重要,但是,用其他 CLI 掩盖错误。提到的命令可能不是最好的方法。

    命令行解决方法:
    R确实有一些有用的命令来处理您可能希望解释器等待的情况,或者可能抑制任何通常会输出到 stderr 的错误。

    For command-line R, error messages written to ‘stderr’ will be sent to the terminal unless ignore.stderr = TRUE. They can be captured (in the most likely shells) by:


    system("some command 2>&1", intern = TRUE)

    还有 wait可以帮助保持过程活跃的论点。

    wait — logical (not NA) indicating whether the R interpreter should wait for the command to finish, or run it asynchronously. This will be ignored (and the interpreter will always wait) if intern = TRUE.


     system("Rscript myscript.R | head 2>&1", intern = TRUE)

    如果抛出任何错误,上面将等待并输出错误。
    system("Rscript myscript.R | head", intern = FALSE, ignore.stderr = TRUE)

    以上不会等待,但会抑制错误,如果有的话。

    关于r - 管道 Rscript 在输出后出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28915838/

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