2016-11-24 3 views
7

Я читаю Advanced R by Hadley Wickham, где представлены некоторые очень хорошие упражнения. Один из них просит описать эту функцию:Понимание оценки входных аргументов функций

f1 <- function(x = {y <- 1; 2}, y = 0) { 
    x + y 
} 
f1() 

Может кто-нибудь помочь мне понять, почему он возвращает 3? Я знаю, что что-то называется ленивой оценкой входных аргументов и, например, другое упражнение просит описание этой функции

f2 <- function(x = z) { 
    z <- 100 
    x 
} 
f2() 

и я правильно предсказал, что вы будете 100; x получает значение z, которое вычисляется внутри функции, а затем возвращается x. Однако я не могу понять, что происходит в f1().

Спасибо.

+2

РЕАЛЬНЫЙ ответ: каждый, кто пишет такой код, должен быть вынужден смотреть 24 часа видео Дональда Трампа или пока их глаза не растают, в зависимости от того, что наступит раньше. –

+0

Это не часть какого-либо кода, а en exercise :) – Celdor

ответ

7

Смотреть это из https://cran.r-project.org/doc/manuals/r-patched/R-lang.html#Evaluation:

Когда функция вызывается или вызывается новый кадр оценки является создана. В этом фрейме формальные аргументы сопоставляются с аргументами в соответствии с правилами, приведенными в сопоставлении Аргумент. Операторы в теле функции оцениваются последовательно в этой среде. ... R имеет форму ленивой оценки аргументов функции. Аргументы не оцениваются до тех пор, пока это не понадобится.

и это от https://cran.r-project.org/doc/manuals/r-patched/R-lang.html#Arguments:

Значения по умолчанию для аргументов могут быть определены с помощью специальной формы «имя = выражение». В этом случае, если пользователь не указывает значение для аргумента при вызове функции, выражение будет связано с соответствующим символом. Когда значение равно , необходимо, чтобы выражение оценивалось в кадре оценки функции .

Таким образом, если параметр не имеет заданного пользователем значения, его значение по умолчанию будет оцениваться в кадре оценки функции. Таким образом, y не оценивается в первую очередь. Когда значение по умолчанию x оценивается в кадре оценки функции, значение y будет изменено на 1, тогда x будет установлено равным 2. Поскольку y уже найден, аргумент по умолчанию не имеет изменений для оценки. если вы попробуете f1(y = 1) и f1(y = 2), результаты по-прежнему 3.

+4

Кроме того, я думаю, стоит упомянуть, что 'y + x' вместо' x + y' возвращает разные значения (в 'f1') –

+0

Хорошо объяснено , Ты :) – Celdor

Смежные вопросы