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

如何在Windows上检查参数是否已正确传递给Rscript,r,command-line,parameters,command-line-arguments,R,Command Line,Parameters,Command Line Arguments,我正在尝试编写一个R脚本,当使用Rscript:input file name运行时,它会接受3个参数,不管它是否有头(值是“header”或“no_header”,以及一个正整数(替换的数量;它适用于引导应用程序)。因此,当我以这种方式运行它时: Rscript bootstrapWithReplacement.R survival.csv header 50 在运行前,应检查是否: 1) 脚本确实包含了3个参数; 2) 第一个参数是否为文件; 3) 第二个参数是否具有“header”或“n

我正在尝试编写一个R脚本,当使用Rscript:input file name运行时,它会接受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)}
}

pcArgs我设法解决了所有的检查,下面是如何解决的:

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.")}

谢谢大家

正如文森特所说,你应该使用
trailingOnly
参数来简化事情。
正如康拉德所说,永远不要直接与
TRUE
FALSE
进行比较
另外,使用断言
进行断言

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!")
库(断言)
图书馆(方法)

cmd_args这一定是一个R脚本而不是一个函数,有什么原因吗?当使用带参数的函数时,所有这些检查都会更直接,并且更可移植。
commandArgs
有一个
trailingOnly
参数,可以简化代码。在检查参数值之前,您可能需要检查提供的参数数量。特别是,
exists
如果变量存在,则返回
TRUE
:在您的情况下,它是一个字符串或
NA
(您可以使用
is.NA
来检查它)。不要显式地将值与
TRUE
FALSE
进行比较,这是一种反模式!例如,只需编写
if(长度(pcArgs)!=8)
等。