使用r-script将JSON从NodeJS传递给R.

时间:2018-06-05 13:06:02

标签: r node.js

我正在尝试在NodeJS应用程序和R脚本之间建立一个简单的连接。 到目前为止,我已设法使用r-script(在npm上找到)设置基本连接和cript的运行。

但是,我无法将简单的json传递给R,因此可以使用jsonlite将其转换为数据帧。

NodeJS代码:

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

var out = R("script.R")
  .data({"Name" : "Mario", "Age" : 32, "Occupation" : "Plumber"},  {"Name" : "Peach", "Age" : 21, "Occupation" : "Princess"}, {}, {"Name" : "Bowser", "Occupation" : "Koopa"})
  .callSync();

console.log(out);

script.R:

library("jsonlite")
mydf <- fromJSON(input[[1]])

这给出了输出:

 'Argument 'txt' must be a JSON string, URL or file.'

我已尝试删除向量的索引(并将完整列表提供给fromJSON),但它也无法正常工作。

是否有人使用此npm模块成功将JSON传递给R脚本?

提前致谢!

编辑: 另外,如果将JSON放在&#34;&#39;&#34;之间,它会给我&#34;尾随错误&#34;在空格中,如果它们被移除,则在{char。

2 个答案:

答案 0 :(得分:2)

我不知道R是如何工作的,但是错误可能表明你试图传递的是一个javascript对象,而不是JSON。 Javascript对象看起来与JSON不同(请参阅此处的讨论Javascript object Vs JSON

您可以尝试的一件事是通过调用对象上的JSON.stringify函数将数据函数传入JSON字符串。像这样:

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

var out = R("script.R")
  .data(JSON.stringify({"Name" : "Mario", "Age" : 32, "Occupation" : "Plumber"}), JSON.stringify( {"Name" : "Peach", "Age" : 21, "Occupation" : "Princess"}),JSON.stringify ({}), JSON.stringify({"Name" : "Bowser", "Occupation" : "Koopa"}))
  .callSync();

console.log(out);

这是一个远景,但它显示了你可以调试的一般方向

答案 1 :(得分:1)

我设法找到了一个简单的解决方案,Manos Agelidis的回答确实让我朝着正确的方向前进。

基本上,我能够使用:

解析输入字符串
string = paste(input, collapse=",") 
string = paste("[",string,"]")
frame = fromJSON(string)

并在NodeJS中:

  var out = R("script.R")
  .data('{"Name":"Mario","Age":32,"Occupation":"Plumber"}',
  '{"Name":"Peach","Age":21,"Occupation":"Princess"}',
  '{}',
  '{"Name":"Bowser","Occupation":"Koopa"}')
  .callSync();

fromJSON需要一个矢量但是以字符串形式,而不是文字向量。因此,我需要使用input的元素创建字符串,并分别将[]添加到字符串的beg和end。这确实正确地转换为数据框架。