R 检查 stdin() 是否为空

R check if `stdin()` is empty

我相信除了 R 之外,几乎所有语言都问过这个问题。

基本上我想检查 stdin() 是否为空,但我不知道该怎么做。

这是因为如果您执行以下代码,您的会话将挂起(可能直到将某些内容发送到相关 R 进程)。

input <- file("stdin", "r")
result <- readLines(input, 1) # Session hangs here

理想情况下,我可以在尝试从中读取任何内容之前检查 input 的状态。

警告

如果您 运行 上面的脚本,那么您可能需要终止 运行ning 进程(无论是在某些 IDE 中还是在 Rscript 中)。

编辑

我发现了一个很有帮助的 SO post 可以阐明这种情况。总之,您可以使用 CTRL + D 向输入发出文件结束条件的信号(目前适用于 readLines(input, -1).

我的最终目标是编写一个 Rscript,它可以通过管道接受来自 stdin 连接的输入。然而,正如我所发现的,R 解释器将等到它收到文件结束条件才返回。如果实际上没有任何内容通过管道传输到 stdin,是否有办法以编程方式调用此信号?

您可以使用 blocking = FALSE。以下脚本将每半秒检查一次来自 stdin 的输入,并在收到整行时终止。

#!/usr/bin/Rscript
inp <- file("stdin", "r", blocking = FALSE)
i <- 0
while (TRUE) {
    line <- readLines(inp, n = 1)
    if (length(line) > 0) {
        cat(sprintf("read a line: %s\n", line))
        break;
    }
    Sys.sleep(0.5)
    cat(sprintf("%d - nothing\n", i))
    i <- i + 1
}