この記事は主に PHP で RScript スクリプトを呼び出す方法を紹介しています。興味のある方は参考にしていただければ幸いです。
何らかの理由で、画像を描画するにはPHPでR voiceを呼び出す必要があります。 Baidu で何度も検索した結果、現在の解決策のほとんどは次のとおりです: exec、system、shell_exec などの PHP のシステム コマンド関数を使用して RScript スクリプトを呼び出す 一般的なコマンド ラインは 2 つあります:
1 つ目:
exec("RScript " . $your_script_dir . "$your_RScript_file " . $args); // 里面有printf某个变量 // echo ("RScript " . $your_script_dir . "$your_RScript_file " . $args);
。 2 番目の 2 つのタイプ:
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 できることがわかり、必要な画像も生成されました。どうしてこれなの? Baidu で何度も試した結果、最終的に解決策を見つけました。ご参考までに。より良い方法がある場合は、コメント エリアに投稿してください。これにより、協力して進歩できるようになります。
1. 失敗した呼び出しの状況を簡単に見てみましょう
これは、PHP で呼び出した R スクリプトのステートメントです。以下は、ブラウザーで呼び出した結果です。
エコーされたステートメントを cmd で実行します。結果は次のようになります:
生成されたファイルは次のとおりです:
ご覧のとおり、最後に取得したい $plotName は null です。これは、実行が成功しなかったことを意味します。 cmd で出力されるファイル情報は取得されません。
2. 解決策
は、RServe と呼ばれる PHP プラグインを提供します。Java を使用して R 言語を呼び出す場合は、これに精通している必要があります。 PHP のバージョンがリリースされたので、それを使用できるようになりました。ダウンロードアドレス: Rserve-php
3. 使い方
もちろん、プラグインには簡単なサンプルもいくつかありますので、それを参照して自分で理解することもできます。これが私の解決策です。ThinkPHP5 フレームワークに基づいて実装しました。
1. まず、プラグインをベンダーに追加する必要があります。次のコードを追加します:
require_once ROOT_PATH . 'vendor/rserve/autoload.php';
use Sentiweb\Rserve\Connection; // 连接R服务的类 use Sentiweb\Rserve\Evaluator; // 简单的理解为:建立连接后返回的处理器 use Sentiweb\Rserve\REXP\Vector; // 内置的存储容器
以前に作成したスクリプトを R の関数に変更する必要があります。言語。形式は次のとおりです:
RScript <- function(arg1, ..., argN) { # code... 请无视这种注释方式,R语言没有注释 return output # 该函数的返回值 }
後で呼び出すために Rserve プラグインを使用します。
後の呼び出しの便宜のために、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]; // 返回结果 } }
ここでは最終的な結果は示しません。これが必要な生徒は自分で試してみてください。
プロジェクトのスケジュールがタイトで、PHP や R 言語に慣れていないため、コマンドの実行を直接呼び出した結果が失敗する理由がわかりません。このことを知っている友人は、コメントで私に返信してください。上記は、PHP で R 言語スクリプトを呼び出す方法に関する私の完全なソリューションです。読んでくださった皆様、ありがとうございました。
その他の関連ビデオ チュートリアルについては、こちらをご覧ください。入門からマスターまでの PHP プログラミングに関するビデオ チュートリアルの完全なセット