Я узнал, что обычной практикой является использование необязательных аргументов в функции и их проверка с помощью missing () (например, как описано в SO 22024082)
В этом примере round0 - необязательный аргумент (я знаю, round0 можно определить как логический).
foo = function(a, round0) {
a = a * pi
if(!missing(round0)) round(a)
else a
}
Но что, если я вызову эту функцию из другой функции, как я могу передать «отсутствует»?
bar = function(b) {
if(b > 10) round1=T
foo(b, round1)
}
Если b ‹10, то round1 в bar () не определен, но все равно передается в foo. Если я изменю foo ():
foo = function(a, round0) {
a = a * pi
print(missing(round0))
print(round0)
if(!missing(round0)) round(a)
else a
}
и запустите bar (9), результат будет:
bar(9)
[1] FALSE
Error in print(round0) : object 'round1' not found
Called from: print(round0)
Это означает: round0 не пропущен, но и недоступен?
Я не хочу использовать разные вызовы функций в bar (), если есть несколько необязательных аргументов в foo (), мне пришлось бы писать вызов функции для каждого отсутствующего / не отсутствующего - комбинации всех необязательных аргументов.
Можно ли пройти проверку «отсутствует» или какое другое решение применимо для этой проблемы?
round1=F
в началеbar
и обновилfoo
наif(!missing(round0) && round0)
. Отсутствующие позволяют вам вызыватьfoo(a)
илиfoo(a,T/F)
, если вы вызываете его с двумя параметрами, второй параметр не отсутствует и должен быть разрешаемым. - person Tensibai   schedule 22.07.2015missing
возвращаетFALSE
, как только объект обещания, представляющий аргумент функции, имеет непустой слот выражения. Добавьте строкуprint(substitute(round0))
сразу послеa = a * pi
в измененную функциюfoo
, а затем выполнитеfoo(9)
.substitute
извлечет слот выражения. Он ничего не напечатает, то есть пустой слот выражения дляround0
. Теперь попробуйтеbar(9)
. Это напечатаетround1
. Но когда вы используетеprint
, R попытается оценитьround1
, который еще не был определен (ленивая оценка). - person cryo111   schedule 22.07.2015