我正在尝试制作一个R脚本-test.R-可以直接从unix中的管道中获取文件或文本字符串,如以下任一种:
file | test.R
或:
cat Sometext | test.R
试图遵循答案here和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.R
和echo AAAA | ./test.R
都产生预期的结果。
答案 0 :(得分:1)
在这里,我仍然喜欢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.csv将stdin读入X”,我想我是从rio或其他软件包中借来的。
编辑:您的示例可以进行一些小的更改:
chmod 0755 ex.R
echo
而不是cat
./ex.R
表示法print(x)
然后:
edd@rob:~$ echo AAA | ./ex.R
[1] "AAA"
edd@rob:~$
答案 1 :(得分:0)
我通常在终端应用程序(BASH shell)中使用R。我只用Rscript做过一些实验,但包括#!这行代码允许脚本在R中运行,同时允许使用RScript生成可执行文件。我必须使用chmod在测试文件上设置可执行标志。您对write()的调用应在R或RScript中将相同的输出打印到控制台,但是,如果要将输出保存到文件中,请调用sink(“ fileName”)打开连接,并调用sink()将其关闭。通常,这使我可以控制输出及其呈现方式。如果我将脚本命名为“ myScript.rs”并使其可执行(chmod u + x myScript.rs),则可以输入./myScript.rs之类的代码来运行它并在OS X或Linux上获取输出。代替管道您可以尝试重定向>或>>来创建或追加。