外部プログラムの実行

Rから外部のプログラムを呼び出し、実行するにはコマンド system を利用する。コマンド system は最も簡単には 'system("実行したいコマンド")' というように用いる。シェルの ls コマンドをRから呼び出してカレントディレクトリの内容を表示させたい場合は以下のようなプログラムファイル foo.R を作成する。

system("ls")

これを以下のように実行する。

1|$Rscript --vanilla --slave foo.R

結果は以下のようになる。カレントディレクトリには bin と work のふたつのディレクトリが存在していることがわかる。

bin work

プログラム foo.R の引数として work を指定して、ディレクトリ work の中身の .txt ファイルのみを表示させるには以下のようなプログラム bar.R を作成する。

argv=commandArgs(T)
dir=argv[1]

system(paste("ls",dir,"|grep .txt$",sep=" "))

これを以下のように引数 work を指定して実行する。

1|$Rscript --vanilla --slave bar.R work

結果は以下のようになる。ディレクトリ work には .txt を拡張子に持つファイルがふたつあることがわかる。

file1.txt
file2.txt

外部プログラムを実行した結果をRの変数に格納したい場合はオプション intern を用いて以下のようにプログラム bar.R を書き換える。

argv=commandArgs(T)
dir=argv[1]

ent=system(paste("ls",dir,"|grep .txt$",sep=" "), intern=T)

print(ent)

これを上と同様に実行する。

1|$Rscript --vanilla --slave bar.R work

結果は以下のようになる。変数 ent に 'ls work |grep .txt$' の結果が文字列ベクトルとして格納されたことがわかる。

[1]"file1.txt" "file2.txt"

オプション input に文字列ベクトルを指定すると、1行につきそのベクトルの要素をひとつ含んだ一時ファイルを生成し、それを外部プログラムの入力ファイルとすることができる。以下のようなプログラム baz.R を作成する。

system("cat", input=c("aaa", "bbb", "ccc"))

これを以下のように実行する。

1|$Rscript --vanilla --slave baz.R

結果は以下のようになる。コマンド cat によってオプション input で指定した文字列が格納された一時ファイルの中身が表示された。

aaa
bbb
ccc

オプションには以下のようなものがある。

OptionDescriptionUsage example
command呼び出したい外部プログラム・コマンドを文字列で指定。command="ls"
internTまたはFで指定。コマンド system の実行結果をR内部の変数として格納した場合、Tを指定。intern=T
ignore.stdoutTまたはFで指定。Fのとき、外部プログラムの実行結果を標準出力させない。ignore.stdout=T
ignore.stderrTまたはFで指定。Fのとき、外部プログラムの実行によって生じる標準エラーを表示させない。ignore.stderr=T
waitTまたはFで指定。Rインタプリタが外部プログラムが実行終了することを待つかどうかの指定。wait=F
input文字列ベクトルを指定。文字列ベクトルの要素を1行につきひとつずつ記載した一時ファイルを生成し、それを command で指定した外部プログラムの入力とする。input=c("foo", "bar")
このエントリーをはてなブックマークに追加

Site search

ページのトップへ戻る