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
}
我相信除了 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
}