2015-06-22 91 views
1

如何在Node.js中生成腳本並將其傳遞到shell?來自node.js的調用shell腳本

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腳本(例如,作爲使用模板的字符串等),執行它(使用execspawn?),並閱讀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

檢查child_process的nodejs文檔。您應該可以像在終端上那樣使用spawnRscriptR命令,並通過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不會從標準輸入讀取默認情況下,變通辦法(http://stackoverflow.com/questions/9370609/piping-stdin-to-r)不會與產卵玩。就此而言,現在我將代碼編寫成一個文件,由R讀入。 – prototype