optparse默认值设为NA时命令行参数无法覆盖问题求助
为什么optparse默认值设为NA时无法接收命令行传入的浮点数?
这事儿的核心原因在于optparse包解析参数的逻辑:它会通过默认值的类型来推断,应该把你传入的命令行参数转换成什么类型。
当你把default=NA时,麻烦就来了——R里的NA是个“无类型”的缺失值(它可以对应数值、字符、逻辑等任意类型的缺失),optparse根本没法判断你期望这个参数是什么类型。这时候它会默认按逻辑值类型来处理参数,而你传入的0.05显然不是TRUE或FALSE,解析直接失败,参数就只能保留默认的NA,导致你的判断分支走了else。
而当你把默认值改成数字(比如0),optparse一眼就明白:“哦,这是个数值型参数”,于是会自动把你传入的字符串"0.05"转换成数值0.05,自然就能正确覆盖默认值,脚本也就正常输出"Chose to sample"了。
解决办法
很简单,在make_option里显式指定参数的类型就行,告诉optparse你要的是数值型参数。修改后的代码如下:
library(optparse) option_list <- list( make_option(c('--sample_p'), default=NA, dest='sample_p', help='Sample probability of inclusion if randomly sampling records', type="numeric") # 关键:显式指定参数类型 ) args <- parse_args(OptionParser(option_list=option_list)) print(args) if(!is.na(args$sample_p)){ print('Chose to sample') }else{ print('Did not choose to sample') }
现在不管你用Rscript test.R --sample_p 0.05还是Rscript test.R --sample_p=0.05的方式传参,0.05都会被正确解析成数值,脚本就能按预期运行啦。
顺带提一句:如果你的参数是字符串或者其他类型,也需要用type参数明确指定(比如type="character"),避免类似的解析问题。
内容的提问来源于stack exchange,提问作者boot-scootin
相关产品推荐
相关产品推荐

