command-line - 起動 - rstudio 保存




Rスクリプトからコマンドラインパラメータを読み取るにはどうすればよいですか? (7)

私はいくつかのコマンドラインパラメータ(コード自体のハードコードパラメータ値ではなく)を提供できるようにしたいRスクリプトを手に入れました。 スクリプトはWindows上で実行されます。

コマンドラインで提供されたパラメータを自分のRスクリプトに読み込む方法に関する情報が見つかりません。 私はそれができない場合、私はちょうど私のGoogleの検索で最高のキーワードを使用していないだろう、私は驚くだろう...

任意のポインタまたは推​​奨事項?


FYI:argsという名前の引数のベクトルと混同しないように、R関数の引数を取り出す関数args()があります


bashでは、次のようなコマンドラインを構築することができます:

$ z=10
$ echo $z
10
$ Rscript -e "args<-commandArgs(TRUE);x=args[1]:args[2];x;mean(x);sd(x)" 1 $z
 [1]  1  2  3  4  5  6  7  8  9 10
[1] 5.5
[1] 3.027650
$

変数$zがbash shellに "10"で置き換えられ、この値がcommandArgsによってcommandArgsされ、 args[2]供給され、rangeコマンドx=1:10がRで正常に実行されたことなどがcommandArgsます。


あなたはlittlerが必要littler ( 'little r'と発音されます)

ダークは約15分で詳細を説明します;)


いくつかの点:

  1. コマンドラインパラメータはcommandArgs()を介してアクセスできるため、概要についてはhelp(commandArgs)を参照してください。

  2. Rscript.exeは、Windowsを含むすべてのプラットフォームで使用できます。 これはcommandArgs()をサポートします。 littlerはWindowsに移植することはできますが、現在はOS XとLinuxでのみ有効です。

  3. CRANには、 getoptoptparseという2つのアドオンパッケージがあり、両方ともコマンドライン解析用に書かれています。

2015年11月の編集:新しい選択肢が登場し、私は全面的に docoptお勧めしdocopt


ダークの答えはあなたが必要とするすべてです。 ここには再現可能な最小限の例があります。

私はexmpl.batexmpl.R 2つのファイルを作った。

  • exmpl.bat

    set R_Script="C:\Program Files\R-3.0.2\bin\RScript.exe"
    %R_Script% exmpl.R 2010-01-28 example 100 > exmpl.batch 2>&1
    

    または、 Rterm.exeを使用して、

    set R_TERM="C:\Program Files\R-3.0.2\bin\i386\Rterm.exe"
    %R_TERM% --no-restore --no-save --args 2010-01-28 example 100 < exmpl.R > exmpl.batch 2>&1
    
  • exmpl.R

    options(echo=TRUE) # if you want see commands in output file
    args <- commandArgs(trailingOnly = TRUE)
    print(args)
    # trailingOnly=TRUE means that only your arguments are returned, check:
    # print(commandArgs(trailingOnly=FALSE))
    
    start_date <- as.Date(args[1])
    name <- args[2]
    n <- as.integer(args[3])
    rm(args)
    
    # Some computations:
    x <- rnorm(n)
    png(paste(name,".png",sep=""))
    plot(start_date+(1L:n), x)
    dev.off()
    
    summary(x)
    

両方のファイルを同じディレクトリに保存し、 exmpl.batを起動しexmpl.bat 。 結果では次のようになります:

  • いくつかのプロットを含むexample.png
  • exmpl.batchをすべて実行した

環境変数%R_Script%追加することもできます:

"C:\Program Files\R-3.0.2\bin\RScript.exe"

あなたのバッチスクリプトで%R_Script% <filename.r> <arguments>

RScriptRScript違い:


フラグ(-h、--help、--number = 42など)を指定してオプションを指定する必要がある場合は、Rパッケージのoptparse(Pythonからインスピレーション)を使用できます: http://cran.r-project.org/web/packages/optparse/vignettes/optparse.pdf : http://cran.r-project.org/web/packages/optparse/vignettes/optparse.pdf

少なくとも私はあなたの質問を理解しています。なぜなら、bash getopt、perl Getopt、python argparse、optparseと同等のものを探すときにこの記事を見つけたからです。


私は単なる素晴らしいデータ構造と処理の連鎖を入れて、このスイッチング動作を生成しました。ライブラリは必要ありませんでした。 何度も何度も実装されているだろうと確信しています。このスレッドを見て、例を探しています。

私はフラグを特に必要としませんでした(ここにあるフラグはデバッグモードですif (!exists(debug.mode)) {...} else {print(variables)}) 。 以下のlapplyステートメントをチェックするフラグは、

if ("--debug" %in% args) debug.mode <- T
if ("-h" %in% args || "--help" %in% args) 

argsは、コマンドライン引数(文字ベクトル、 c('--debug','--help')に相当するもの)を読み込んだときの変数です。

それは他の旗のために再利用可能であり、あなたはすべての繰り返しを避けます。

args <- commandArgs(TRUE)

flag.details <- list(
"debug" = list(
  def = "Print variables rather than executing function XYZ...",
  flag = "--debug",
  output = "debug.mode <- T"),
"help" = list(
  def = "Display flag definitions",
  flag = c("-h","--help"),
  output = "cat(help.prompt)") )

flag.conditions <- lapply(flag.details, function(x) {
  paste0(paste0('"',x$flag,'"'), sep = " %in% args", collapse = " || ")
})
flag.truth.table <- unlist(lapply(flag.conditions, function(x) {
  if (eval(parse(text = x))) {
    return(T)
  } else return(F)
}))

help.prompts <- lapply(names(flag.truth.table), function(x){
# joins 2-space-separatated flags with a tab-space to the flag description
  paste0(c(paste0(flag.details[x][[1]][['flag']], collapse="  "),
  flag.details[x][[1]][['def']]), collapse="\t")
} )

help.prompt <- paste(c(unlist(help.prompts),''),collapse="\n\n")

# The following lines handle the flags, running the corresponding 'output' entry in flag.details for any supplied
flag.output <- unlist(lapply(names(flag.truth.table), function(x){
  if (flag.truth.table[x]) return(flag.details[x][[1]][['output']])
}))
eval(parse(text = flag.output))

ここでflag.detailsにはコマンドが文字列として格納され、 eval(parse(text = '...'))評価されることに注意してください。 Optparseはどんな深刻なスクリプトにとっても明らかに望ましいですが、機能性の低いコードも時には良いです。

サンプル出力:

$ Rscript check_mail.Rscript --help
--debug Print  variables rather than executing function XYZ...

-h  --help  Display flag definitions




parameters