R 스크립트에서 명령 행 매개 변수를 읽으려면 어떻게해야합니까?


281

코드 자체의 하드 코드 매개 변수 값 대신 여러 명령 줄 매개 변수를 제공 할 수있는 R 스크립트가 있습니다. 스크립트는 Windows에서 실행됩니다.

명령 줄에 제공된 매개 변수를 R 스크립트로 읽는 방법에 대한 정보를 찾을 수 없습니다. 이 작업을 수행 할 수없는 경우 놀라게되므로 Google 검색에서 최상의 키워드를 사용하지 않는 것 같습니다.

어떤 조언이나 권장 사항이 있습니까?


rscript 실행 파일의 위치를 ​​설정해야합니다.

답변:


209

여기 Dirk의 대답 은 필요한 모든 것입니다. 최소한의 재현 가능한 예가 있습니다.

두 개의 파일을 만들었습니다 : exmpl.batexmpl.R.

  • 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. 결과는 다음과 같습니다.

  • example.png 약간의 음모와 함께
  • exmpl.batch 다 끝났어

환경 변수를 추가 할 수도 있습니다 %R_Script%.

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

배치 스크립트에서 다음과 같이 사용하십시오. %R_Script% <filename.r> <arguments>

간의 차이점 RScriptRterm:

  • Rscript 더 간단한 구문이 있습니다
  • Rscriptx64에서 자동으로 아키텍처를 선택합니다 (자세한 내용은 R 설치 ​​및 관리, 2.6 하위 아키텍처 참조)
  • Rscriptoptions(echo=TRUE)명령을 출력 파일에 쓰려면 .R 파일에 필요

127

몇 가지 사항 :

  1. 를 통해 명령 줄 매개 변수에 액세스 할 수 commandArgs()있으므로 help(commandArgs)개요를 참조하십시오 .

  2. Rscript.exeWindows를 포함한 모든 플랫폼에서 사용할 수 있습니다 . 지원 commandArgs()합니다. 더 작은 것은 Windows로 이식 될 수 있지만 지금은 OS X 및 Linux에서만 작동합니다.

  3. CRAN에는 getoptoptparse의 두 가지 애드온 패키지 가 있으며 모두 명령 줄 구문 분석을 위해 작성되었습니다.

2015 년 11 월 편집 : 새로운 대안이 나타 났으며 docopt를 진심으로 추천 합니다 .


2
그리고 argparse가있다
gkcn

92

이것을 스크립트 상단에 추가하십시오.

args<-commandArgs(TRUE)

그럼 당신은로 전달 된 인수를 참조 할 수 있습니다 args[1], args[2]

그런 다음 실행

Rscript myscript.R arg1 arg2 arg3

인수가 공백이있는 문자열 인 경우 큰 따옴표로 묶습니다.


7
이것은 args <-commandArgs (TRUE) (대문자 A 참고)를 사용할 때만 작동했습니다.
Andy West

arg1 전에 --args가 필요합니까?
Philcolbourn

@philcolbourn 아니오
Chris_Rands

15

더 좋은 것을 원한다면 library (getopt) ...를 사용해보십시오. 예를 들면 다음과 같습니다.

spec <- matrix(c(
        'in'     , 'i', 1, "character", "file from fastq-stats -x (required)",
        'gc'     , 'g', 1, "character", "input gc content file (optional)",
        'out'    , 'o', 1, "character", "output filename (optional)",
        'help'   , 'h', 0, "logical",   "this help"
),ncol=5,byrow=T)

opt = getopt(spec);

if (!is.null(opt$help) || is.null(opt$in)) {
    cat(paste(getopt(spec, usage=T),"\n"));
    q();
}

11

당신은 필요 의 littler (발음 '작은 R')를

더크는 약 15 분 안에 정교해질 것이다.)


11

때문에 optparse답변에 몇 번 언급하고 명령 행 처리를위한 포괄적 키트를 제공하고있다, 여기 당신이 입력 파일이 존재하는 가정, 그것을 사용하는 방법에 대한 간단한 간단한 예입니다 :

script.R :

library(optparse)

option_list <- list(
  make_option(c("-n", "--count_lines"), action="store_true", default=FALSE,
    help="Count the line numbers [default]"),
  make_option(c("-f", "--factor"), type="integer", default=3,
    help="Multiply output by this number [default %default]")
)

parser <- OptionParser(usage="%prog [options] file", option_list=option_list)

args <- parse_args(parser, positional_arguments = 1)
opt <- args$options
file <- args$args

if(opt$count_lines) {
  print(paste(length(readLines(file)) * opt$factor))
}

blah.txt23 줄 의 임의의 파일 이 제공됩니다.

명령 행에서 :

Rscript script.R -h 출력

Usage: script.R [options] file


Options:
        -n, --count_lines
                Count the line numbers [default]

        -f FACTOR, --factor=FACTOR
                Multiply output by this number [default 3]

        -h, --help
                Show this help message and exit

Rscript script.R -n blah.txt 출력 [1] "69"

Rscript script.R -n -f 5 blah.txt 출력 [1] "115"


7

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가 "10"으로 bash 쉘로 대체 되고이 값이에 의해 선택되어 commandArgs입력되고 R이 성공적으로 실행 args[2]하는 range 명령 x=1:10등을 볼 수 있습니다.


4

참고 : args () 함수가 있습니다.이 함수는 R 함수의 인수를 검색하고 args라는 인수의 벡터와 혼동하지 않습니다.


1
이것은 거의 사실이 아닙니다. 함수 만 함수를 마스킹 할 수 있습니다. 함수와 이름이 같은 변수를 만들면 함수가 가려지지 않습니다. 이 질문과 답변을 참조하십시오 : stackoverflow.com/q/6135868/602276
Andrie

사실, 그것을 가리지 않습니다. 일반적으로 R에 이미 존재하는 이름을 가진 함수와 변수의 이름을 피하려고합니다.
Tim

1

플래그와 함께 옵션을 지정해야하는 경우 (예 : -h, --help, --number = 42 등) R 패키지 optparse (Python에서 영감을 받음)를 사용할 수 있습니다. http://cran.r-project.org /web/packages/optparse/vignettes/optparse.pdf .

bash getopt 또는 perl Getopt 또는 python argparse 및 optparse에 해당하는 항목을 찾을 때이 게시물을 찾았 기 때문에 적어도 이것이 귀하의 질문을 이해하는 방법입니다.


1

라이브러리가 필요없는이 스위칭 동작을 생성하기 위해 멋진 데이터 구조와 처리 체인을 결합했습니다. 나는 그것이 여러 번 구현되었을 것이라고 확신하고 예제를 찾고있는이 스레드를 발견했습니다.

특히 플래그가 필요하지 않았습니다 (여기서 유일한 플래그는 디버그 모드이며, 다운 스트림 함수를 시작하는 조건으로 확인하는 변수를 만듭니다 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 함수 XYZ를 실행하지 않고 변수를 인쇄합니다.

-h --help 플래그 정의 표시
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.