2012-11-20 21 views
6

私はそれを実行したときに自分自身を見つけるために、次のコードを持っているスクリプト(Main.Rそれを呼び出す)があります。コマンドラインから実行しているRの中で、スクリプトはどのようにして自分自身を見つけることができますか?

frame_files <- lapply(sys.frames(), function(x) x$ofile) 
frame_files <- Filter(Negate(is.null), frame_files) 
main.dir <- dirname(dirname(frame_files[[length(frame_files)]])) 

がこれを呼び出すために使用されている独自のディレクトリ、main.dir、上記のディレクトリを取得するために使用されますこのパスに関連する他のスクリプト

私は、コマンドからスクリプトを呼び出したときに、たとえば

R CMD BATCH Main.R 

または

Rscript Main.R 

残念ながら、上記のコマンドは動作しません。私は、コマンドラインからこのスクリプトを実行するに興味がありますライン。

Main.Rに入れることのできるコードはありますか、代わりにRまたはRscriptというコールオプションを使用できますか?

具体的には、ソリューションはWindowsで動作する必要があります。アイデアに

+0

これは役に立ちますか? http://stackoverflow.com/questions/750786/whats-the-best-way-to-use-r-scripts-on-the-command-line – atomh33ls

+0

公正であるために、わかりませんが、それのように見える。私は、私はコマンドラインを使用することで偉大ではないと言う必要があります。私は自分の投稿を編集して私がWindowsを使っていると付け加えました。答えに違いがあるのか​​どうか分かりません。いくつかの他の記事を読んで、私は印象#を得る! Windowsでは動作しません。 – J4y

答えて

8

を読み取るためのコードを追加するスクリプトがsourceまたはのいずれかで実行されたときに、あなたに正しいファイル・ディレクトリのパスを与えるソリューションです。 Rscript。

# this is wrapped in a tryCatch. The first expression works when source executes, the 
# second expression works when R CMD does it. 
full.fpath <- tryCatch(normalizePath(parent.frame(2)$ofile), # works when using source 
       error=function(e) # works when using R CMD 
        normalizePath(unlist(strsplit(commandArgs()[grep('^--file=', commandArgs())], '='))[2])) 
dirname(full.fpath) 

このキーは、機能normalizePathです。相対パス名または短縮パス名を指定すると、normalizePathは有効なパスを返すか、エラーを発生させます。 Rscriptからスクリプトを実行するときに、normalizePathに現在のスクリプトのベースファイル名を指定すると、現在のディレクトリに関係なくフルパスが返されます。 R CMDへの相対パスを指定すると、現在のディレクトリに同じ名前のスクリプトがある場合でも、パスを取得できます。

上記のコードでは、commandArgsによって返された文字列の1つからファイル名を抽出します。 commandArgsの出力を見ると、ファイル名が第4引数であることがわかります。引数は '--file = yourscript.R'として記録されているので、上の最後の行で '='に文字列を分割してファイル名を取り出します。

+1

+1 - しかし、 '--scanilla'や' --file = [...] 'のような余分なオプションを付けて' Rscript'を実行するとどこでも終わる可能性があります。 '4'のようなハードコードされた位置を使うのではなく、grepのような関数を使って見つけるのが賢明でしょう。 – flodel

+0

これに注意を引くことに感謝します。簡潔さのためにそれを放っておいてください。 –

+0

@mplourdeありがとう!私は 'normalizePath'を知らなかった。私はあなたが 'tryCatch'を使ってそれをすべてそこに持っているのが好きです。 – J4y

1

は、私はあなたがRScriptでそれを呼び出すと仮定し、あなたのMain.R

の引数としてパスを与えることです。あなたのMain.Rで

Rscript Main.R 'path' 

あなたは、引数以下

args <- commandArgs(trailingOnly = TRUE) 
mainpath <- as.character(args[1]) 
関連する問題