R 스크립트에서 명령 행 매개 변수를 읽으려면 어떻게해야합니까?
코드 자체의 하드 코드 매개 변수 값 대신 여러 명령 줄 매개 변수를 제공 할 수있는 R 스크립트가 있습니다. 스크립트는 Windows에서 실행됩니다.
명령 줄에 제공된 매개 변수를 R 스크립트로 읽는 방법에 대한 정보를 찾을 수 없습니다. 이 작업을 수행 할 수없는 경우 놀라게되므로 Google 검색에서 최상의 키워드를 사용하지 않는 것 같습니다.
어떤 조언이나 권장 사항이 있습니까?
여기 Dirk의 대답 은 필요한 모든 것입니다. 최소한의 재현 가능한 예가 있습니다.
나는 두 개의 파일을 만들어 : exmpl.bat
와 exmpl.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>
간의 차이점 RScript
과 Rterm
:
Rscript
더 간단한 구문이 있습니다Rscript
x64에서 자동으로 아키텍처를 선택합니다 (자세한 내용은 R 설치 및 관리, 2.6 하위 아키텍처 참조).Rscript
options(echo=TRUE)
명령을 출력 파일에 쓰려면 .R 파일에 필요
몇 가지 사항 :
명령 줄 매개 변수는을 통해 액세스 할 수
commandArgs()
있으므로help(commandArgs)
개요를 참조하십시오 .Rscript.exe
Windows를 포함한 모든 플랫폼에서 사용할 수 있습니다 . 지원commandArgs()
합니다. 더 작은 것은 Windows로 이식 될 수 있지만 현재는 OS X 및 Linux에서만 작동합니다.CRAN에는 getopt 및 optparse의 두 가지 애드온 패키지 가 있으며 모두 명령 줄 구문 분석을 위해 작성되었습니다.
2015 년 11 월 편집 : 새로운 대안이 나타 났으며 docopt를 진심으로 추천 합니다 .
이것을 스크립트 상단에 추가하십시오.
args<-commandArgs(TRUE)
그럼 당신은로 전달 된 인수를 참조 할 수 있습니다 args[1]
, args[2]
등
그런 다음 실행
Rscript myscript.R arg1 arg2 arg3
인수가 공백이있는 문자열 인 경우 큰 따옴표로 묶습니다.
더 좋은 것을 원한다면 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();
}
때문에 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.txt
23 줄 의 임의의 파일 이 제공됩니다.
명령 행에서 :
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"
당신은 필요 의 littler (발음 '작은 R')를
더크는 약 15 분 안에 정교해질 것이다.)
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
등을 볼 수 있습니다.
참고 : args () 함수가 있습니다.이 함수는 R 함수의 인수를 검색하며 args라는 인수의 벡터와 혼동하지 않습니다.
플래그와 함께 옵션을 지정해야하는 경우 (예 : -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에 해당하는 항목을 찾을 때이 게시물을 찾았 기 때문에 적어도 이것이 귀하의 질문을 이해하는 방법입니다.
라이브러리가 필요없는이 스위칭 동작을 생성하기 위해 멋진 데이터 구조와 처리 체인을 결합했습니다. 나는 그것이 여러 번 구현되었을 것이라고 확신하고,이 스레드를 발견하여 예제를 찾고 있습니다.
특히 플래그가 필요하지 않았습니다 (여기서 유일한 플래그는 디버그 모드이며, 다운 스트림 함수를 시작하는 조건으로 확인하는 변수를 만듭니다 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 플래그 정의 표시
참고 URL : https://stackoverflow.com/questions/2151212/how-can-i-read-command-line-parameters-from-an-r-script
'IT' 카테고리의 다른 글
`에 대한 ng- 모델 (0) | 2020.03.25 |
---|---|
오류 : (1, 0) ID가 'com.android.application'인 플러그인을 찾을 수 없습니다 (0) | 2020.03.25 |
첫 번째 경기 만 잡고 (0) | 2020.03.25 |
Dockerfile에서 PATH 환경 변수를 업데이트하는 방법은 무엇입니까? (0) | 2020.03.25 |
FOREIGN KEY 제약 조건을 도입하면 사이클 또는 여러 계단식 경로가 발생할 수 있습니다. 왜 그렇습니까? (0) | 2020.03.25 |