web-dev-qa-db-ja.com

Rスクリプトを実行可能にする方法は?

これが重複するリスクが高いことは承知していますが、ここにある他のどの質問でも、私の問題に対する回答は見つかりませんでした。以下は、私がすでに試したことの要約です。

Rスクリプトファイルがありますfile.r

#!/usr/bin/env Rscript 
print("Hello World!")

実行可能です(chmod +x file.r)を使用して、以前は問題なく実行されていました(前回使用したのは約1か月前です)。

$ ./file.r

ただし、今日:

$ ./file.r
/usr/bin/env: 'Rscript\r': No such file or directory

実際には:

$ which Rscript
/usr/bin/Rscript 

したがって、私はシバンを次のように変更しました:#!/usr/bin Rscript、 だが:

$ ./file.r
/usr/bin: bad interpreter: Permission denied

それから私はそれをスーパーユーザーとして実行すると思ったが、:

$ Sudo ./file.r
Sudo: unable to execute ./file.r: Permission denied

周りを読んで、Rを新しくインストールすると問題が解決することがわかったので、Rをアンインストールしてインストールしました。残念ながら、以前に書いたことがまだ当てはまります。ただし、以下は両方のShebangバージョンで機能することに注意してください。

$ Rscript file.r
[1] "Hello World!"

何が悪いのですか?

12
k88074

あ、キャリッジリターン(\ r)の問題です。viエディターを使用している場合は、最初の行に追加されます:set list表示されます。行末は$、キャリッジリターン文字は^ Mとして表示されます。

#!/usr/bin/env Rscript  Makes your script portable than #!/usr/bin/Rscript

ところで、\ rをviに挿入するには、insert(i)/ Append(a)モードに入り、ctrl + vと入力してからctrl + mと入力します。

11
Ravi

実行可能ファイルを直接指定する場合は、シバンの後に完全なパスが必要です(スペースなし)。

#!/usr/bin/Rscript

Raviが指摘したように、この修正が機能しない場合、解決策は改行を削除して再度挿入することだけです。

私はenv回避策のファンではありません。これは、物事をよりポータブルにするためのものです。これは、行をより混乱させ、ほとんどの人は、それが実際に別のプログラム(つまりenv)を呼び出していることに気付かないからです。変更されたシェルでコードを実行します。その詳細情報 ここ

2
gringer