コマンドライン(ターミナル)でRスクリプトを使用する最良の方法は何ですか?


114

コマンドラインから簡単なプロットを行うためのRスクリプトがあると非常に便利です。ただし、bashスクリプトからRを実行することは、まったく便利ではありません。理想は次のようなものかもしれません

#!/path/to/R
...

または

#!/usr/bin/env R
...

しかし、私はそれらのどちらも機能させることができませんでした。

もう1つのオプションは、スクリプトをRで純粋に保持するscript.RことR --file=script.Rです。たとえば、などでスクリプトを呼び出します。ただし、スクリプトは、コードの一部がスクリプトの外部に存在する不明瞭なコマンドラインスイッチに依存する場合があります。例:ローカルの.Rprofileを介してbashからRにこっそり入れると、目的のスイッチは--vanillaを除いてすべてが意味し--no-init-fileます。

もう1つのオプションは、Rフラグを保存し、簡単に実行できるようにするbashスクリプトで、これによりRスクリプトが呼び出されます。問題は、これが単一のプログラムが2つのファイルに分割され、同期を維持したり、新しいマシンに一緒に転送したりする必要があるということです。

私が現在最も嫌うオプションは、Rをbashスクリプトに埋め込むことです。

#!/bin/bash
... # usage message to catch bad input without invoking R
... # any bash pre-processing of input
... # etc
R --random-flags <<RSCRIPT
# R code goes here
RSCRIPT

すべてが1つのファイルに含まれています。実行可能で、引数を簡単に処理します。問題は、bashとRをこのように組み合わせると、IDEがどちらかで失敗しない可能性がほとんどなくなり、私の心が本当に傷つくことです。

私が見逃しているより良い方法はありますか?

回答:


131

内容script.r

#!/usr/bin/env Rscript

args = commandArgs(trailingOnly = TRUE)
message(sprintf("Hello %s", args[1L]))

最初の行はシバン行です。/usr/bin/env RscriptRインストールへのパスをハードコーディングする代わりにを使用することをお勧めします。そうしないと、スクリプトが他のコンピューターで壊れる危険があります。

次に、(コマンドラインで)実行可能にします。

chmod +x script.r

コマンドラインからの呼び出し:

./script.r world
# Hello world

1
はい、これが「公式な」方法だと思います。
フランク

5
またRscript --help、コマンドラインから実行すると、シバンに追加できる便利なオプションが多数リストされ--vanillaます。
flodel

8
コマンドラインを解析するためのcommandArgs関数getoptoptparseパッケージについても触れましょう。そのため、コマンドラインから実行するときに、引数とオプションをスクリプトに渡すこともできます。
flodel

1
#!/usr/bin/Rscriptこれは(Rスクリプトの標準的な方法ではない)場合にのみ機能することに注意してください。
2017年

16

少しお試しください。littlerGNU Rにハッシュバン(つまり、#!/ some / pathで始まるスクリプト)機能を提供し、簡単なコマンドラインとパイプの使用を提供します。


10

ミゲル・サンチェスの反応は、本来あるべき姿です。Rscriptを実行するもう1つの方法は、システム全体のRScriptを実行するための「env」コマンドです。

#!/usr/bin/env Rscript

1
ない「システム全体」のではなく、envあなたが最初に実行できるようになるRscript自分自身の中で見つかりました$PATHので、1が実際に何かを実行することができ、他のシステム全体/デフォルト以外Rscript(にインストールされていない可能性/usr/whatever)。envfor RおよびRscriptstuff を使用することをお勧めします。これらは特に標準的な場所にインストールされない可能性があるためです。(bashただし、通常のスクリプトでは通常、常に安全に使用できます#!/bin/bash。)
michael

@michaelいいえ、あなたはバッシュに関して間違っています、そしてこれは危険なアドバイスです。安全にハードコーディングできるのは、だけです/bin/sh。それ以外はすべてenvルックアップを使用する必要があります。特に、多くの場合、Bashはコンピューティングクラスターでは古く、ユーザーは独自のカスタムインストールを持っています(通常、~/.local/binにあるか、/softwareNFSマウントのようなもので共有されます)。同様に、MacOSの上、/bin/bashされ、常に起因する問題のライセンスに時代遅れ、とバッシュがより一般的に位置された日まで/usr/local/bin/bash(私はあなたのコメントは3歳ですが、これはかなり重要であると認識。)
コンラートルドルフ

いいえ、申し訳ありませんが、それは単に本当ではありません。しかし、あなたはこの問題について強い意見を持っているので、この問題については議論しません。使用すること/bin/shが、いかなる状況においても「危険」ではない場合、同じことをに認めることを認めなければなりません/bin/bash。さまざまなユーザーの設定envが信頼できる/一貫性がないため、使用はより予測不可能PATHですが、各Rユーザーは実際にこの動作を望んでいる可能性がありますが、bashスクリプトはそうではありません。最後に、新しいbashスクリプトを呼び出すCI /クラウドの場合は、単に使用する/path/to/my/bash myscriptか、パスを明示的に設定してを使用して呼び出しますenv script。EOT
マイケル

9

#!/path/to/RR自体がスクリプトexecveなので、機能しません。

私が使う R --slave -f script


4
Fyiからカジュアルな読者まで:これらの回答の多くは、ご参考までにRscript(およびlittler)の前にあります。
マイケルは2016年

@michael 2007年にR 2.5.0でリリースされたRscriptより前の回答はありません。
Konrad Rudolph


4

これは機能します

#!/usr/bin/Rscript

しかし、マシンに複数のバージョンのRがインストールされている場合、どうなるかわかりません。

このようにすると

#!/usr/bin/env Rscript

これは、パスの最初に現れるRを使用するようにインタープリターに指示します。


2

スクリプトの実行に使用しているプログラムにパラメーターが必要な場合は、#の最後に配置できます。ライン:

#!/usr/bin/R --random --switches --f

Rを知らないので、適切にテストすることはできませんが、これはうまくいくようです:

axa@artemis:~$ cat r.test
#!/usr/bin/R -q -f
error
axa@artemis:~$ ./r.test
> #!/usr/bin/R -q -f
> error
Error: object "error" not found
Execution halted
axa@artemis:~$

2

この投稿に追加するメモです。のそれ以降のバージョンはいくぶんR埋められているようですRscript。2015年1月にダウンロードしたOSXのR 3.1.2-1の場合Rscript

/sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript

したがって、のようなものの代わり#! /sw/bin/Rscriptに、スクリプトの先頭で次を使用する必要がありました。

#! /sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript

locate Rscriptあなたに役に立つかもしれません。


OPがどのプラットフォーム(* nixまたはMac OS)を参照しているかが明確でないため、この回答は役立つ可能性があります。少し手直し(コードをフォーマットして、謝罪の冒頭を削除するように見える)することで、これはここでの回答への良い追加になるでしょう。
ベンバーンズ2015年

2
これは#!/usr/bin/env RscriptRスクリプトでハードコードされたパスの代わりに使用する(そしてその長いパスをに追加する$PATH)もう1つの理由です
マイケル

0

pythonのrpy2モジュールを使用することもできます。ただし、これを行う「正しい」方法は、R CMD BATCHを使用することです。これを変更してSTDOUTに書き込むことができますが、デフォルトでは.Routファイルに書き込みます。以下の例をご覧ください。

[ramanujan:~]$cat foo.R
print(rnorm(10))
[ramanujan:~]$R CMD BATCH foo.R
[ramanujan:~]$cat foo.Rout

R version 2.7.2 (2008-08-25)
Copyright (C) 2008 The R Foundation for Statistical Computing
ISBN 3-900051-07-0

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

[Previously saved workspace restored]


 ~/.Rprofile loaded.
Welcome at  Fri Apr 17 13:33:17 2009
> print(rnorm(10))
 [1]  1.5891276  1.1219071 -0.6110963  0.1579430 -0.3104579  1.0072677 -0.1303165  0.6998849  1.9918643 -1.2390156
>

Goodbye at  Fri Apr 17 13:33:17 2009
> proc.time()
   user  system elapsed
  0.614   0.050   0.721

注:--vanillaやその他のオプションを試して、起動時の残骸をすべて取り除いてください。


0

コマンドラインでクイックRスクリプトを作成するには、smallRを試してください。

http://code.google.com/p/simple-r/

rディレクトリ内のコマンド)

smallRを使用してコマンドラインからプロットすると、次のようになります。

r -p file.txt

2
これは(死んでいるように見えます)よりlittlerも確かに好まれます(まだ生きているためです)。または、単にRscript(実際littlerに作成された後に出てきたものです)
michael

-1

WindowsでMSYS bashを使用すると、次のように動作します-LinuxボックスにRがないので、そこで試すことができません。あなたは2つのファイルが必要です-runrと呼ばれる最初のファイルはファイルパラメータでRを実行します

# this is runr
# following is path to R on my Windows machine
# plus any R params you need
c:/r/bin/r --file=$1

この実行可能ファイルをchmod + x runrで作成する必要がありますます。

次に、スクリプトファイルで:

#!runr
# some R commands
x = 1
x

#に注意してください!runr行には、コマンドの使用方法、PATH変数の設定方法などに応じて、runrへの完全パスを含める必要がある場合があります。

きれいではありませんが、動作するようです。


1
異なるパラメーターを必要とする異なるRスクリプトについてはどうですか?コマンドラインからRスクリプトに引数を渡すのはどうですか?
blahdiblah 2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.