Какова логика этой функции в R? - PullRequest
0 голосов
/ 07 февраля 2019

Я изучаю аргументы в функциях R, но у меня есть некоторые проблемы с пониманием логики этого.

h <- function(a = 1, b = d){
    d <- (a + 1)^2
    c(a, b)
}

h()
# [1] 1 4

Я ожидал, что сообщение об ошибке будет возвращено, потому что нет значения b.d создается в функции h, но нет кода, подобного b = d, который присваивает значение b в функции h.

Однако результат равен [1] 1 4.

Как были связаны b и d?

1 Ответ

0 голосов
/ 07 февраля 2019

Значения аргументов функции по умолчанию лениво оцениваются в 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 не может быть найден в вызывающей среде.

...