R, STDIN для Rscript - PullRequest
       10

R, STDIN для Rscript

0 голосов
/ 01 декабря 2018

Я пытаюсь создать сценарий R - test.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)

Тогда и cat file | ./test.R, и echo AAAA | ./test.R дают ожидаемое.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Я обычно использую R из терминального приложения (оболочка BASH).Я только сделал несколько экспериментов с Rscript, но в том числе #!line позволяет запускать скрипт в R, а также разрешать использование RScript для генерации исполняемого файла.Я должен использовать chmod, чтобы установить исполняемый флаг в моем тестовом файле.Ваш вызов write () должен вывести тот же вывод на консоль в R или RScript, но если я хочу сохранить свой вывод в файл, я вызываю сток ("fileName"), чтобы открыть соединение, и приемник (), чтобы закрыть его.Это обычно дает мне контроль над выводом и тем, как он отображается.Если я назвал свой сценарий «myScript.rs» и сделал его исполняемым (chmod u + x myScript.rs), я могу напечатать что-то вроде ./myScript.rs, чтобы запустить его и получить вывод в OS X или Linux.Вместо трубы |Вы можете попробовать перенаправление> или >> для создания или добавления.

0 голосов
/ 01 декабря 2018

Мне все еще нравится 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 в X через 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:~$
...