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
相关产品推荐
相关产品推荐

