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.R
和 echo 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 或其他包中借用的想法。
编辑:您的示例稍作改动即可运行:
- 使其可执行:
chmod 0755 ex.R
- 管道输出正确,即使用
echo
而不是 cat
- 对当前目录中的文件使用
./ex.R
表示法
- 我改成使用
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。代替管道 |您可以尝试重定向 > 或 >> 来创建或追加。
我正在尝试制作一个 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.R
和 echo 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 或其他包中借用的想法。
编辑:您的示例稍作改动即可运行:
- 使其可执行:
chmod 0755 ex.R
- 管道输出正确,即使用
echo
而不是cat
- 对当前目录中的文件使用
./ex.R
表示法 - 我改成使用
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。代替管道 |您可以尝试重定向 > 或 >> 来创建或追加。