从node.js调用Rscript

时间:2017-01-24 02:25:00

标签: r node.js rscript node.js-stream

我一直在尝试从node.js服务器执行Rscript。试图在线跟踪一个例子,但我一直得到一个null返回的对象,或者有时这个过程会一直运行。我已经提到了下面的代码片段。谢谢。

example.js ::

var R = require("r-script");


var out = R("scripts/testScript.R")
        .data("hello world", 20)
        .callSync(function(err,resp){
                      console.log(out);
                   });

testScript.R file :::

needs(magrittr)
set.seed(512)
do.call(rep, input) %>% 
strsplit(NULL) %>% 
sapply(sample) %>% 
apply(2, paste, collapse = "")

2 个答案:

答案 0 :(得分:1)

对于Windows用户:

您需要将环境变量添加到Windows的%PATH%变量中。 R脚本包需要调用" R"来自CMD的命令。如果R.exe没有被设置为环境可用,那么它永远无法调用" R"来自任何地方的命令。

查找如何将环境变量添加到Windows,并记住:如果包含可执行文件的文件夹的路径有空格,则必须在双引号之间添加。 " C:\ Program Files \ R \ R-3.3.2 \ bin \ x64"

如果您已经这样做但问题仍然存在,我只能想到两个原因:

  1. 你的R方法出了问题,它在R会话中给出了一个内部异常。

  2. 系统无法找到该文件。也许检查文件路径。

答案 1 :(得分:0)

您可以在节点中使用子进程来调用其他语言。我发现从节点调用Python最简单,并使用Python的子进程模块然后调用R:

<强>节点

var spawn = require("child_process").spawn

var process = spawn('python',["call_r.py", script_choice, function_choice]);

这会调用我们的 call_r.py 文件传递我们的脚本功能选项:

PYTHON(call_r.py)

import subprocess
import sys

script_choice = sys.argv[1]
function_choice = sys.argv[2]

call_script = 'R_Scripts/' + script_choice + '.R'
cmd = ['Rscript', call_script] + [function_choice]
result = subprocess.check_output(cmd, universal_newlines=True)

print(result)
sys.stdout.flush()

这解析传递的脚本和函数选择,通过Python的子进程模块调用R.

R(已选择的脚本)

myArgs <- commandArgs(trailingOnly = TRUE)
function_choice <- myArgs[1]

# add your R functions here

eval(parse(text=function_choice))

这里,R解析传递的函数选择并对其进行求值。注意,只需将参数包含在函数参数中即可将参数传递给选择的R函数(例如my_function('hey there'))