簡體   English   中英

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

[英]Sending JSON files in a system2 command in 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代碼並不適合,但無論如何都沒有關系。

我認為問題可能是我不能包含帶有嵌入式引號的參數,這對於小型數據框而言是一種簡單的解決方法,但對於大型數據幀而言則根本不可行。 所以我的問題是,在不刪除所有引號的情況下,有什么方法可以在此system2命令中將JSON文件作為參數發送嗎?

如果我們制作一個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保存到臨時文件並從臨時文件中讀取可能會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM