2011-08-04 20 views
5

私は問題があります。私はPHPからコマンドラインでRスクリプトを実行しています。計算のために2つの配列を与える必要があります。phpからコマンドライン経由で配列を渡すR

私が実行してスクリプトを呼び出す:

Rscript nls.R ??? ??? 

???そして?特定の値を計算するために、Rに「与える」必要がある配列です。

誰でもこの方法を知っていますか?これはコマンドラインであるためphpに限定されません。コマンドライン経由で配列をRに渡すことができるかどうかを知る必要があります。

Rはどのようなコマンドでそれをキャッチしますか?

ありがとうございます。

よろしくあなたが探しているコマンドはcommandArgs()

+1

注:PHPからRscriptを実行する方法に応じて、引き渡される引数がWebユーザからのものである場合は、セキュリティホールがないか調べてください。 – Spacedman

答えて

4

です。

さて、文字列にカンマで区切られた整数は、あなたが

s = '1,2,3,4,5' 
your_list = lapply(strsplit(s, ','), as.numeric)[[1]] 

これを実現する、より単純明快な方法があるかもしれません整数を得ることができる場合には、例えば、リストを持っている場合。

EDIT:

より良い例(もRscriptで動作するはずです)

$ R "1,2,3,4,5" 
... 

>lapply(strsplit(commandArgs()[[2]], ','), as.numeric)[[1]] 
[1] 1 2 3 4 5 
+0

これは、配列が小さいので、トリックを行います。そのため、それらを文字列に連結し、Rでそれらを再解析します。ありがとう、皆さん! – Nemanja

2

あなたが(まあ、ない簡単)Rscriptに、このようなものを渡すことはできません。 Rscriptには-eオプションがあります。そのうちの1つはR式です。だから、あなたの配列を作るRの式である文字列を生成するPHPを得ることができ、それぞれの式を渡して別の-e引数を使って配列を作成することができます。

R関数commandArgs()が取得して利用できるコマンドライン引数を渡すこともできます。例hereを参照してください。ただし、引数がどのように渡され、Rによって評価されるかについては、遊びが必要な場合があります。

上記のサイズは、おそらく有用ではありません。この場合、RscriptよりRと通信する他の方法を検討する必要があります。

+0

独自のスクリプトと組み合わせて-eオプションを使用するのは難しいです。作業ディレクトリを設定し、-eを使ってスクリプトを実行することは、それほど単純ではありません... –

3

あなたのRスクリプトを修正し、commandArgs()への呼び出しを含める必要があります。オプションtrailingOnly=TRUEと一緒に使用すると、呼び出し後にスペースで区切られた引数を持つ文字ベクトルが返されます。これにより、引数をさらに操作することができます。

考えると、スクリプトmyscript.r:

#My script 
x <- commandArgs(trailingOnly=TRUE) 
print(x) 
print(str(x)) 

あなたは、コマンドラインRscript myscript.r 1 2 3から呼び出し、これはあなたにあなたの配列で、テキストファイルの名前を渡すために可能性を与え

Loading required package: ... 
... 
[1] "1" "2" "3" 
chr[1:3] "1" "2" "3" 
NULL 

F:\Temp 

得ることができますRscript。私が異なる言語を組み合わせた場合、私は通常、中間結果を保存するためにテキストファイルを使用します。

あなたがサービス提供の過程でRを実行したいと仮定すると、あなたがRscriptのオプションのいずれかを使用する場合は、注意してください(たとえば、--no-保存)、スクリプトの前にそれらを配置する必要があり、例えばRscript --no-save myscript.r

4

ウェブページには、コマンドラインよりもRを呼び出す良い方法がいくつかあります。問題は、Rインタプリタが非常に遅く始まり、何度も何度も何度もやり直すために、時間とCPUの力を浪費しているということです。

たとえば、triggrの小さなRサーバーを作成し、PHPソケットで作成したクライアントを使用してそのサーバーと通信することができます。
シンプルで重いアイデアは、rApacheアプリを作成してCURLで話したり、AJAXやHTMLプロバイダとして直接使用することです。

関連する問題