您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

PHP中如何调用RScript脚本(附代码)

2024/6/11 22:33:43发布32次查看
这篇文章主要介绍了php中如何调用rscript脚本,有一定的参考价值,感兴趣的朋友可以参考一下,希望对你有所帮助!
由于某个原因,需要在php中调用r语音进行绘制图像。经过多方百度,目前大部分解决方案都是:利用php中的系统命令函数如exec,system,shell_exec等等来调用rscript脚本,常见的命令行有如下两种
第一种:
exec(rscript  . $your_script_dir . $your_rscript_file  . $args);    // 里面有printf某个变量// echo (rscript  . $your_script_dir . $your_rscript_file  . $args);
第二种:
system("r --slave < " . $your_rscript_dir . "$your_rscript_file" . " --args " . $args); // 里面有printf某个变量// echo ("r --slave < " . $your_rscript_dir . "$your_rscript_file" . " --args " . $args);
接下来,我们满怀信心地去运行php的时候,会发现我们所执行系统命令返回的值是1,也就是失败。但是,我们拿echo出来的语句去cmd窗口执行,发现是可以printf出结果,并且也生成了我想要的图像。这是为什么呢?经过多方百度跟尝试,终于找到解决方案。供大家参考并欢迎大家如果有更好的方法,也在评论区中发文,大家共同努力进步。
一、简单看下失败的调用情况
这是我在php中调用的r脚本的语句,下面是在浏览器中调用的结果。
我们再将echo出来的语句,在cmd中执行下。结果如下:
生成的文件如下:
可以看到,我最后想要得到的$plotname是null,也就是没有执行成功,或者没有得到cmd中打印出来的文件信息。
二、解决方法
提供一个php插件,名字叫rserve,这个你如果是用java来调用r语言的,想必并不陌生。现在出了php版本的,我们就可以拿过来使用。下载地址:rserve-php
三、如何使用
当然,该插件有中间也有一些简单的例子,可以自行参考理解。下面放出我的解决方法:本人是基于thinkphp5的框架实现的。
1. 我们首先要将它加入到我们的项目中,我把该插件放到我的vendor里。添加如下代码:
require_once root_path . 'vendor/rserve/autoload.php';
2. 根据自身需要使用里面的一些类use sentiweb\rserve\connection; // 连接r服务的类use sentiweb\rserve\evaluator; // 简单的理解为:建立连接后返回的处理器use sentiweb\rserve\rexp\vector; // 内置的存储容器
3. 编写rscript脚本我们需要将之前所编写的脚本,修改为r语言的函数。格式如下:
rscript <- function(arg1, ..., argn) { # code... 请无视这种注释方式,r语言没有注释 return output # 该函数的返回值}
为后期我们利用rserve插件调用。
4. 编写我们的php函数我们为了后期方便调用,将调用rscript脚本的功能统一写到一个函数里面,方便阅读且容易维护。
class common { // $source 表示自己编写的r语言函数文件 // $file, $cancer:本r函数所需要参数 function rscript($source, $file, $cancer) { $cnx = new connection(rserve_host); // 与rserve_host建立连接,一般为自己服务器地址,如果本地,则为localhost $eval = new evaluator($cnx, evaluator::parser_rexp); // 通过连接,生成处理器,后一个参数决定连接失败时返回错误信息 $eval->evaluate("source('$source')"); // 类似library,将函数载入r的编程环境中;evaluate计算括号内的r命令 // 同理,执行r命令,注意括号内是字符串的形式,由于返回的是rserve的rstring类,为了拿到我想要的信息,通过vector类的tohtml转为含return信息的标签语言 $rstring = $eval->evaluate("rscript('$file', '$cancer')")->tohtml(); preg_match("/$cancer.+.pdf/", $rstring, $filename); // 提炼信息 return $filename[0]; // 返回结果 }}
5. 成功实现这里我就不展示我的最终结果了,有这需要的同学们可以自己尝试。
四、失败的原因由于项目时间紧迫,对php、r语言熟悉度不高,不明白为什么直接调用命令执行的结果是失败的。有这方面认识的小伙伴们,可以在评论里回复我。以上就是我关于php如何调用r语言脚本的全部解决方案。谢谢大家的阅读。
更多相关视频教程请访问 php编程从入门到精通全套视频教程
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product