【问题标题】:calling an Rscript from node.js从 node.js 调用 Rscript
【发布时间】:2017-06-08 17:01:53
【问题描述】:

我一直在尝试从我的 node.js 服务器执行 Rscript。试图在网上跟随一个例子,但我一直得到一个空返回的对象,或者有时这个过程会一直运行下去。我在下面提到了代码 sn-p。谢谢。

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 文件 :::

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

【问题讨论】:

  • 如果你使用一个只打印“hello”的普通 R 程序怎么办?
  • 哪个进程永远运行,R进程还是node进程?另外我认为您尝试在.callSync 的回调中记录一个在函数返回之前未定义的变量可能是一个问题。
  • 我这里有一个例子,但没有使用r-script:github.com/stla/CallingRinNode

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


【解决方案1】:

Windows 用户:

您需要将环境变量添加到 Windows 的 %PATH% 变量中。 R-script 包需要从 CMD 调用“R”命令。如果 R.exe 没有设置为环境变量,那么它将永远无法从任何地方调用“R”命令。

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

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

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

  2. 系统找不到文件。也许检查文件路径。

【讨论】:

    【解决方案2】:

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

    节点

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

    这会调用我们的 call_r.py 文件,并传递我们的 scriptfunction 选项:

    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 的 subprocess 模块调用 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'))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-03
      • 2016-06-12
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2012-02-16
      • 1970-01-01
      相关资源
      最近更新 更多