2015-06-22 6 views
1

Как я могу сгенерировать скрипт в Node.js и pipe в оболочку?вызвать скрипт оболочки из node.js

E.g. Я могу создать этот файл, например. hello.R, сделать его исполняемым chmod +x hello.R и запустить его из командной строки, ./hello.R:

#!/usr/bin/Rscript 
hello <- function(name) { return (sprintf("Hello, %s", name); }) 
cat(hello("World")); 

То, что я хотел бы сделать, это сделать эквивалент от узла. Конкретно сгенерируйте более сложный R-скрипт в памяти (например, в виде строки с использованием шаблонов и т. Д.), Выполните его (используя или spawn?) И прочитайте stdout.

Но я не могу вполне понять, как труба сценарий к R. Я попытался это (между прочим):

var rscript = [  
    hello <- function(name) { return (sprintf("Hello, %s", name); }) 
    cat(hello("World")); 
].join('\n'); 

var exec = require('child_process').exec; 
exec(rscript, { shell: '/usr/bin/R'}, function(err, stdout, stderr) { 
    if (err) throw(err); 
    console.log(stdout); 
}); 

Однако это не удается, как это не кажется ни /usr/bin/R, ни /usr/bin/Rscript понять -c переключатель:

+1

Просто для информации, вы можете использовать [библиотека rstats] (https://github.com/Planeshifter/node-Rstats), в качестве альтернативы. –

ответ

2

Проверьте документы nodejs от child_process. Вы должны быть в состоянии spawnRscript или R команду, как и на терминале, и отправлять свои команды за child.stdin.

var c = require('child_process'); 
var r = c.spawn("R",""); 
r.stdin.write(rscript); 
/* now you should be able to read the results from r.stdout a/o r.stderr */ 
+0

Спасибо! Оказывается, проблема заключается в том, что R и Rscript по умолчанию не читаются из stdin, и обходные пути (http://stackoverflow.com/questions/9370609/piping-stdin-to-r) не очень хорошо воспроизводятся с помощью spawn. Будет ли лапша на этом, пока я пишу код как файл, который нужно прочитать R. – prototype

Смежные вопросы