You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用R脚本传JSON参数引号丢失,如何修复R解析错误?

问题解决方法

核心原因

命令行 shell 会将 JSON 中的双引号解析为 shell 语法的引号分隔符,导致传递给 R 的参数丢失了键名的双引号,最终造成 JSON 解析错误。

方案一:使用 shell 参数转义(推荐)

在 PHP 中用 escapeshellarg() 函数对 JSON 字符串进行转义,确保 shell 将其作为完整的单个参数传递,保留所有原始字符:

// 推荐用 json_encode 生成合法 JSON,避免手动编写出错
$data = [
    ['area' => 30, 'ind' => [5,5,4,5,4.14,3.75], 'isCluster' => true],
    ['area' => 31, 'ind' => [], 'isCluster' => false]
];
$n = json_encode($data);

// 转义 JSON 参数,避免 shell 解析引号
$escapedJson = escapeshellarg($n);
$command = "\"C:\\Program Files\\R\\R-4.3.0\\bin\\Rscript.exe\" C:\\xampp\\htdocs\\CKmeans1D.R $escapedJson";
exec($command, $output);

print_r($output);

方案二:通过临时文件传递 JSON(适合大体积数据)

绕开命令行参数传递的问题,将 JSON 写入临时文件,让 R 读取文件内容:

PHP 代码:

$data = [
    ['area' => 30, 'ind' => [5,5,4,5,4.14,3.75], 'isCluster' => true],
    ['area' => 31, 'ind' => [], 'isCluster' => false]
];
$n = json_encode($data);

// 创建临时文件并写入 JSON
$tempFile = tempnam(sys_get_temp_dir(), 'r_json_');
file_put_contents($tempFile, $n);

// 传递临时文件路径给 R
$command = "\"C:\\Program Files\\R\\R-4.3.0\\bin\\Rscript.exe\" C:\\xampp\\htdocs\\CKmeans1D.R $tempFile";
exec($command, $output);

// 清理临时文件
unlink($tempFile);

print_r($output);

R 代码修改:

library(jsonlite)

args <- commandArgs(trailingOnly = TRUE)
# 读取临时文件中的 JSON
x <- fromJSON(readLines(args[1], warn = FALSE))
x

内容的提问来源于stack exchange,提问作者LVC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:07:49