Значения аргументов функции по умолчанию лениво оцениваются в R (т. Е. Оцениваются только тогда, когда они нужны):
См. Вывод этого кода для примера:
printme <- function(name,x){cat('evaluating',name,'\n');x}
h <- function(a = printme('a',1), b = printme('b',d)){
cat('computing d...\n')
d <- (a + 1)^2
cat('d computed\n')
cat('concatenating a and b...\n')
c(a, b)
cat('a and b concatenated\n')
}
h()
Вывод на консоль:
computing d...
evaluating a
d computed
concatenating a and b...
evaluating b
a and b concatenated
Как видите, d
вычисляется до оценки значения по умолчанию b
РЕДАКТИРОВАТЬ:
Более тогоКак правильно указано в комментариях @ BrodieG , аргументы по умолчанию оцениваются в функциональной среде;на самом деле, в приведенном выше примере b
можно инициализировать значением переменной d
, определенной внутри среды функций.
Вместо этого при указании аргумента (без использования значения по умолчанию),выражение, которое назначает параметр, все еще лениво вычисляется, но на этот раз в вызывающей среде, например:
# same functions as above, but this time we specify the parameters in the call
h(a=printme('a',123),b=printme('d',d))
Вывод на консоль:
computing d...
evaluating a
d computed
concatenating a and b...
evaluating d
Error in printme("d", d) : object 'd' not found
Обратите внимание на ошибку, когда аргумент b
равеноценивается, потому что d
не может быть найден в вызывающей среде.