如何检查参数是否已正确传递给Windows上的Rscript

时间:2013-10-13 13:46:10

标签: r command-line parameters command-line-arguments

我正在尝试编写一个R脚本,当使用Rscript运行时输入3个参数:输入文件名,是否有标题(值为'header'或'no_header',以及正整数(替换次数;它用于引导程序)。所以,当我以这种方式运行它时:

Rscript bootstrapWithReplacement.R survival.csv header 50

它应该在运行之前检查是否: 1)该脚本确实采用了3个参数; 2)第一个参数是否是文件; 3)第二个参数是否具有'header'或'no_header'值,以及 4)如果传递的数字是正整数。

到目前为止,这是我的代码:

pcArgs      <- commandArgs()
snOffset    <- grep('--args', pcArgs)
inputFile <- pcArgs[snOffset+1]
headerSpec <- pcArgs[snOffset+2]    ## header/no_header
numberOfResamples <- pcArgs[snOffset+3] ## positive integer

check.integer <- function(N){
    !length(grep("[^[:digit:]]", as.character(N)))
}

if (!file_test("-f",inputFile)) {stop("inputFile not defined. Proper use: Rscript bootstrapWithReplacementFile.R survival.csv header 50.")}
if (!exists("headerSpec")) {stop("headerSpec not defined. Proper use: Rscript bootstrapWithReplacementFile.R survival.csv header 50.")} 
if (!exists("numberOfResamples")) {stop("numberOfResamples not defined. Proper use: Rscript bootstrapWithReplacementFile.R survival.csv header 50.")} 

if ((headerSpec != 'header') == TRUE & (headerSpec != 'no_header') == TRUE) {stop("headerSpec not properly defined. Correct values: 'header' OR 'no_header'.")}
if (check.integer(numberOfResamples) != TRUE | (numberOfResamples>0) != TRUE) {stop("numberOfResamples not properly defined. Must be an integer larger than 0.")}


if (headerSpec == 'header') {
    inputData<-read.csv(inputFile)
    for (i in 1:numberOfResamples) {write.csv(inputData[sample(nrow(inputData),replace=TRUE),], paste("./bootstrap_",i,"_",inputFile,sep=""), row.names=FALSE)}
}

if (headerSpec == 'no_header') {
    inputData<-read.table(inputFile,header=FALSE)
    for (i in 1:numberOfResamples) {write.table(inputData[sample(nrow(inputData),replace=TRUE),], paste("./bootstrap_",i,"_",inputFile,sep=""),
 sep=",", row.names=FALSE, col.names=FALSE)}
}

我的问题是,检查文件是否存在,但是对于标头或整数则不行。

另外,我怎样才能在开始时检查是否已经传递了所有三个参数?

谢谢!

2 个答案:

答案 0 :(得分:2)

正如文森特所说,你应该使用trailingOnly commandArgs论证来简化事情 正如康拉德所说,永远不会直接与TRUEFALSE进行比较 另外,使用assertive进行断言。

library(assertive)
library(methods)    
cmd_args <- commandArgs(TRUE)

if(length(cmd_args) < 3)
{
  stop("Not enough arguments. Please supply 3 arguments.")
}
inputFile <- cmd_args[1]
if (!file_test("-f", inputFile)) 
{
  stop("inputFile not defined, or not correctly named."
}
headerSpec <- match.arg(cmd_args[2], c("header", "no_header"))
numberOfResamples <- as.numeric(cmd_args[3])
assert_all_numbers_are_whole_numbers(numberOfResamples)
assert_all_are_positive(numberOfResamples)

message("Success!")

答案 1 :(得分:1)

我设法解决了所有检查,方法如下:

if ((length(pcArgs) == 8) == FALSE) {stop("Not enough arguments. Please supply 3 arguments. Proper use example: Rscript bootstrapWithReplacementFile.R survival.csv header 50.")}
if (!file_test("-f",inputFile)) {stop("inputFile not defined, or not correctly named. Proper use example: Rscript bootstrapWithReplacementFile.R survival.csv header 50.")}
if ((headerSpec != 'header') == TRUE & (headerSpec != 'no_header') == TRUE) {stop("headerSpec not properly defined. Correct values: 'header' OR 'no_header'.")}
if (check.integer(numberOfResamples) != TRUE | (numberOfResamples>0) != TRUE) {stop("numberOfResamples not properly defined. Must be an integer larger than 0.")}

谢谢大家!