2016-11-02 8 views
0

ワイルドカード*を含むコマンド引数を使用してRscriptを実行すると、引数はファイルパスの文字ベクトルに展開されます一致するものがなければ合格する。ワイルドカードを常に渡す方法はありますか?スクリプト内で自分で扱うことができます(たとえば、Sys.globなどを使用します)。ここでRscriptにコマンドライン引数でワイルドカードを強制的に渡すことはできますか?

は、端末から実行し、最小限の例です:

ls 
## foo.csv bar.csv baz.txt 
Rscript -e "print(commandArgs(T))" *.csv 
## [1] "foo.csv" "bar.csv" 
Rscript -e "print(commandArgs(T))" *.txt 
## [1] "baz.txt" 
Rscript -e "print(commandArgs(T))" *.rds 
## [1] "*.rds" 

編集:私は、この動作はbashのではなく、Rscriptからのものであることを学びました。特定のRスクリプトではなくRscriptコマンドでワイルドカード展開を抑制するために、R内からこの動作を回避する方法はありますか?私の場合、複数の個々のRDSファイルの内容をリストに連結し、結果をout.rdsに保存する2つの引数、Rscript collapse.R *.rds out.rdsを持つ関数を実行したいとします。しかし、ワイルドカードはRに渡される前に拡張されているので、2番目の引数が指定されているかどうかをチェックする方法はありません。

+0

Windows *は拡張機能を搭載していないため、あなたは* nixにいると思います。 http://stackoverflow.com/questions/11456403/stop-shell-wildcard-character-expansion –

+0

いくつかの例を投稿する... plzを参照してください。 –

+0

@ 42-ありがとう!例を追加しました。 – Empiromancer

答えて

2

私が正しく理解している場合は、bashにワイルドカードを使用したくない場合は、式自体を渡したいとします。 *.csv。いくつかのオプションが含まれます:

  1. は、別のコマンドで、あるいは

    Rscript -e "list.files(pattern = commandArgs(T))" "*\.csv$" 
    
  2. パスだけ延長し、R内*を処理することを評価することにより、いずれか、Rの中に引用されたテキストやプロセスでそれを表現を渡します文脈別に

    Rscript -e "list.files(pattern = paste0('*\\\\.', commandArgs(T)))" "csv$" 
    
  3. 複雑で不必要な手段によって、そのコマンドのグロブを無効にします。Stop shell wildcard character expansion?

注:あまりにも貪欲に一致しないように、引数を正規表現に変更しました。

関連する問題