optparse NA по умолчанию не перезаписывается аргументом командной строки - PullRequest
0 голосов
/ 19 февраля 2020

Рассмотрим следующий скрипт:

library(optparse)

option_list <- list(
    make_option(c('--sample_p'), default=NA, dest='sample_p', help='Sample probability of inclusion if randomly sampling records')
)

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')
}

Я хочу передать скрипту значение с плавающей запятой, которое будет храниться в args$sample_p. Я попробовал следующее, но ни один из подходов не оставляет меня с 0.05 сохраненным:

$ Rscript test.R --sample_p 0.05
$sample_p
[1] NA

$help
[1] FALSE

[1] "Did not choose to sample"
$ Rscript test.R --sample_p=0.05
Warning message:
In getopt(spec = spec, opt = args) :
  long flag sample_p given a bad argument
$sample_p
[1] NA

$help
[1] FALSE

[1] "Did not choose to sample"

Однако, если я изменю значение по умолчанию sample_p на число вместо NA, это работает:

library(optparse)

option_list <- list(
    make_option(c('--sample_p'), default=0, dest='sample_p', help='Sample probability of inclusion if randomly sampling records')
)

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
$sample_p
[1] 0.05

$help
[1] FALSE

[1] "Chose to sample"

Почему NA в качестве значения по умолчанию вызывает проблемы?

1 Ответ

1 голос
/ 19 февраля 2020

Похоже, вам нужно использовать NA_real_, чтобы указать тип NA для использования в этом контексте (https://stat.ethz.ch/R-manual/R-devel/library/base/html/NA.html).

option_list <- list(
    make_option(c('--sample_p'), default=NA_real_, dest='sample_p', help='Sample probability of inclusion if randomly sampling records')
)

Это в основном из-за того, как type обрабатывается в make_option().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...