我一直在尝试从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 = "")
答案 0 :(得分:1)
对于Windows用户:
您需要将环境变量添加到Windows的%PATH%变量中。 R脚本包需要调用" R"来自CMD的命令。如果R.exe没有被设置为环境可用,那么它永远无法调用" R"来自任何地方的命令。
查找如何将环境变量添加到Windows,并记住:如果包含可执行文件的文件夹的路径有空格,则必须在双引号之间添加。 " C:\ Program Files \ R \ R-3.3.2 \ bin \ x64"
如果您已经这样做但问题仍然存在,我只能想到两个原因:
你的R方法出了问题,它在R会话中给出了一个内部异常。
系统无法找到该文件。也许检查文件路径。
答案 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'))