我正在尝试进行一个R脚本测试。R-可以直接从unix中的管道中获取文件或文本字符串,如中所示
file | test.R
或:
cat Sometext | test.R
我试着在这里和这里找到答案,但我显然错过了一些东西。是上面的管道还是下面的脚本给了我一个错误,比如:
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)
则CCD_ 1和CCD_。
我仍然喜欢这里的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 file | ./test.R
0 - 对当前目录中的文件使用
./ex.R
表示法 - 我把它改为使用
print(x)
然后:
edd@rob:~$ echo AAA | ./ex.R
[1] "AAA"
edd@rob:~$
我通常使用终端应用程序(BASH shell(中的R。我只做了一些Rscript的实验,但包括#!行允许脚本在R中运行,同时允许使用RScript生成可执行文件。我必须使用chmod在我的测试文件上设置可执行标志。您对write((的调用应该将相同的输出打印到R或RScript中的控制台,但如果我想将输出保存到一个文件中,我会调用sink("fileName"(打开连接,并调用sink((关闭连接。这通常会让我控制输出及其呈现方式。如果我将我的脚本称为"myScript.rs"并使其可执行(chmod u+x myScript.rr(,我可以键入类似的内容/myScript.rs来运行它并在OS X或Linux上获得输出。您可以尝试重定向>或>>来创建或附加,而不是管道|。