6

Main.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で機能する必要があります。

4

2 に答える 2

8

source以下は、Rscript を使用して、または 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 への相対パスを指定し、現在のディレクトリに同じ名前のスクリプトがある場合でも、正しいパスを取得します!

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

于 2012-11-20T18:55:59.773 に答える
1

アイデアとしては、 Main.R への引数としてパスを与えることです

RScriptで呼び出すとします。

Rscript Main.R 'path' 

Main.R で、引数を読み取るコードを追加します

args <- commandArgs(trailingOnly = TRUE)
mainpath <- as.character(args[1])  
于 2012-11-20T18:48:17.087 に答える