有没有一种方法可以从JavaScript运行R代码?

52

我正在进行一个需要运行一些R代码进行数据分析的项目。该项目主要使用JavaScript编写,我需要一种从JS中运行R代码的方法。我的研究还没有找到一个好的方法来实现它。有没有什么办法可以做到这一点呢?

此外,我对R几乎没有任何经验(另一个人提供了R代码)。


你使用IE或其他浏览器吗?Internet Explorer确实有一种从javascript脚本Windows的机制,但您需要调整安全设置....然后使用Rscript.exe,您可以像这样运行yourScript.Rvar shell = new ActiveXObject('WScript.Shell');shell .Run("Rscript yourScript.R arg1"); - agstudy
现在,我正在使用Chrome进行开发。我认为我不会轻易地改变。 - H Khan
这是在浏览器上的Javascript,对吧?这是为Web客户端设计的吗?这很重要,因为现在JS不仅仅是一个Web客户端语言,它也可以作为一个完全特权的语言(参见node.js)在机器上运行,以及在Web浏览器中作为沙盒语言运行。 - Spacedman
1
你是否已经了解shiny?http://www.rstudio.com/shiny/ 如果你还不知道它,我建议在尝试花费太多时间去做“困难的事情”之前先了解一下。特别是要注意使用html直接编写教程页面以及动态ui的相关内容;http://rstudio.github.io/shiny/tutorial/#dynamic-ui - geneorama
@Spacedman 是的,尽管我将来可能会将后端移至node.js,但它目前是一个基于客户端浏览器的项目。 - H Khan
如果你正在使用node,可以使用'node-Rstats': https://github.com/Planeshifter/node-Rstats。 - Stéphane Laurent
3个回答

24

如果您可以接受在服务器上运行R代码,那么您应该看看OpenCPU。它提供了一个REST API和相应的JavaScript库,用于将R代码发送到服务器并获取结果。特别是,它解决了作为服务器运行R时可能出现的安全问题(例如,R代码可以运行任意shell命令)。有公共演示实例可供尝试,此页面提供了一个简单的教程。


链接已损坏! - Lucas Prestes
链接已损坏,请使用备用链接 https://github.com/abresler/ramnathv.github.io/blob/master/posts/making-rcharts-live-app/index.md - Andrija

13

如何看待 R-node ?

我认为另一种选择是使用 node.js 作为服务器 (http://nodejs.org/),并在内部调用 R 作为子进程,搜索 Node.js API 文档以了解具体信息。

此外,可以参考以下内容确认: 是否可能从node.js中执行外部程序?

注意: node 可以运行任何您可能有的 JS 脚本,它们不一定需要是特定于 node 的。


你能否添加一下R-node的解释? - Jamie Bull
1
当然,我个人没有尝试过,但这是直接从gitourious引用的,你只需要点击那个微小的“更多...”链接 :)//// R-Node是一个面向统计分析软件R的Web前端。使用此前端,您可以从任何Web浏览器连接到运行在远程(或本地)服务器上的R实例,并与之交互,发送命令并接收响应。特别是,绘图命令,如plot()和hist()将在浏览器中执行,绘制SVG图像。 - user2578094
2
最好将信息放在SO上,甚至最好放在答案中。网页有一个讨厌的习惯,就是会移动或被编辑。看起来这是一个有用的包,希望它能留下来。 - Jamie Bull
我认为这可能是我的最佳机会。谢谢! - H Khan

2

这并不是最好的方法,但是我为了自己的Javascript+R项目,能够做到以下操作(silly.r是一个位于“r”目录中的R脚本)。我基本上是从我的express服务器中作为终端命令运行R代码:

app.get('/sfunction', function (req, res) {
    exec('Rscript r/silly.r this is a test', function(error, stdout, stderr) {
        if (error) {
            console.log(error);
            res.send(error);
        }
        else if (stderr) {
            console.log(stderr);
            res.send(stderr);
        }
        else if (stdout) {
            console.log("RAN SUCCESSFULLY");
            res.sendfile("savedoutput/test.json");
        }
    });
});

代码来自这里的第167-182行:https://github.com/ngopal/VisualEncodingEngine/blob/master/jsserver/app.js


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接