R,STDIN 到 Rscript

R, STDIN to Rscript

我正在尝试制作一个 R 脚本 - test.R - 它可以直接从 unix 中的管道获取文件或文本字符串,如以下任一方式:

file | test.R

或:

cat Sometext | test.R

试图遵循答案 here and here 但我显然遗漏了一些东西。是上面的管道还是下面的脚本给我这样的错误:

me@lnx: cat AAAA | test.R
bash: test.R: command not found
cat: AAAA: No such file or directory

我的测试脚本:

#!/usr/bin/env Rscript
input <- file("stdin", "r")
x <- readLines(input)
write(x, "")

更新。

剧本:

#!/usr/bin/env Rscript
con <- file("stdin")
open(con, blocking=TRUE)
x <- readLines(con)
x <- somefunction(x) #Do something or nothing with x
write(x,"")
close(con)

然后 cat file | ./test.Recho AAAA | ./test.R 都会产生预期的效果。

这里我还是喜欢r胜过Rscript(不过我也不是不偏不倚的……)

edd@rob:~$ (echo "Hello,World";echo "Bye,Bye") | r -e 'X <- readLines(stdin());print(X)' -
Hello,World
Bye,Bye
[1] "Hello,World" "Bye,Bye"
edd@rob:~$ 

r也可以直接read.csv()

edd@rob:~$ (echo "X,Y"; echo "Hello,World"; echo "Bye,Bye") | r -d -e 'print(X)' -
      X     Y
1 Hello World
2   Bye   Bye
edd@rob:~$

-d 本质上是一个预定义的 'read stdin into X via read.csv',我认为我是从 rio 或其他包中借用的想法。

编辑:您的示例稍作改动即可运行:

  1. 使其可执行:chmod 0755 ex.R
  2. 管道输出正确,即使用 echo 而不是 cat
  3. 对当前目录中的文件使用./ex.R表示法
  4. 我改成使用print(x)

然后:

edd@rob:~$ echo AAA | ./ex.R
[1] "AAA"
edd@rob:~$

我通常在终端应用程序中使用 R (BASH shell)。我只用 Rscript 做了一些实验,但包括 #! line 允许脚本在 R 中为 运行,同时允许使用 RScript 生成可执行文件。我必须使用 chmod 在我的测试文件上设置可执行标志。您对 write() 的调用应该在 R 或 RScript 中将相同的输出打印到控制台,但是如果我想将我的输出保存到一个文件中,我调用 sink("fileName") 来打开连接并调用 sink() 来关闭它。这通常让我可以控制输出及其呈现方式。如果我调用我的脚本 "myScript.rs" 并使其可执行 (chmod u+x myScript.rs) 我可以输入类似 ./myScript.rs 到 运行 的内容并在 OS X 或 Linux。代替管道 |您可以尝试重定向 > 或 >> 来创建或追加。