我试图通过使用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文件作为参数而不只是删除所有引号?
答案 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保存到临时文件并从中读取它可能会更好(从长远来看)临时文件。