在R中的system2命令中发送JSON文件?

时间:2016-10-11 00:37:58

标签: json r

我试图通过使用system2命令从R调用python。我试图将R中的数据帧转换为JSON格式,然后通过system2命令传递它。

对于一个简单的例子,给定数据帧df:

A  B  C 
1  2  3 
4  5  6 

然后,使用' jsonlite'我转换' df'以json格式。

df_converted = jsonlite::toJSON(df)

然后我想使用一个简单的system2命令。

path_to_script  = "C:/myscript.py"
allArgs = c(path_to_script, df_converted)
system2('python', args = allArgs, stdout=TRUE)

由于我在问R问题,我觉得包含python代码是不合适的,但无论如何它都是无关紧要的。

我认为问题可能是我不能包含一个嵌入引号的参数,这对于小型数据帧来说是一个简单的(ish)修复,但对于大型数据帧来说根本不是。所以我的问题是,有没有办法在这个system2命令中发送JSON文件作为参数而不只是删除所有引号?

1 个答案:

答案 0 :(得分:0)

如果我们制作bash脚本:

#!/bin/bash
echo $1 | jq '.'

并将其/tmp(即/tmp/example.sh),然后执行:

library(jsonlite)

df <- read.table(text="A  B  C 
1  2  3
4  5  6", header=TRUE) 

system2("/tmp/example.sh", shQuote(toJSON(df)))

我们在R控制台中得到这个:

[
  {
    "A": 1,
    "B": 2,
    "C": 3
  },
  {
    "A": 4,
    "B": 5,
    "C": 6
  }
]

你不幸需要使用Python,所以我们也会提出:

#!/usr/local/bin/python3

from sys import argv
import json

param = json.loads(argv[1])

print(json.dumps(param, indent=4)) # larger indent than jq's default
/tmp/example.py

并将R脚本中的行更改为:

system2("/tmp/example.py", shQuote(toJSON(df)))

并获得:

[
    {
        "A": 1,
        "B": 2,
        "C": 3
    },
    {
        "A": 4,
        "B": 5,
        "C": 6
    }
]

在R控制台中,因此JSON正确传入。

我同意@ r2evans,如果你有一大块JSON并且可以修改你需要调用的脚本,那么将JSON保存到临时文件并从中读取它可能会更好(从长远来看)临时文件。