답변:
여기 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 파일에 필요몇 가지 사항 :
이것을 스크립트 상단에 추가하십시오.
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"
참고 : 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 플래그 정의 표시