Это объяснено в разделе 4.3.3 руководства по языку R .
Когда вызывается функция, каждому формальному аргументу присваивается обещание
в локальной среде вызова со слотом выражения
содержащий фактический аргумент (если он существует) и слот среды
содержащий среду звонящего. Если нет фактического аргумента для
формальный аргумент дается в вызове и по умолчанию
выражение, он аналогично назначается в слот выражения
формальный аргумент, но с окружающей средой, установленной на локальный
окружающая среда.
Процесс заполнения ячейки значения обещания путем оценки
содержимое слота выражения в среде обещания называется
заставляя обещание. Обещание будет выполнено только один раз, значение
содержимое слота, используемое непосредственно позже.
Ничто не имеет значения, пока сумма не начнет вычисляться. Сначала требуется a
, поэтому его выражение оценивается. Обещание для b
теряется, поскольку ему присваивается значение непосредственно во время форсирования a
, и поэтому фактическое обещание b
назначения в определении функции вообще не оценивается.
Если порядок наоборот, вы видите другой результат:
f2 <- function(a = 2, b = {a <- 10; 2}) {
a+b
}
f2()
[1] 4
Тем не менее, обратите внимание, что значение a
будет 10 в конце функции, но 2, когда это требуется во время суммирования. Оба обещания оцениваются здесь.
Если порядок сумм в f1
поменялся местами на b+a
, вы обнаружите поведение, аналогичное f2
.
Ранее в этом разделе было вынесено общее предупреждение о том, что в назначениях следует избегать побочных эффектов, поскольку они не гарантируют, что они будут оценены.
R имеет форму ленивой оценки аргументов функции. Аргументы
не оценивается, пока не потребуется. Важно понимать, что в некоторых
В случаях аргумент никогда не будет оцениваться. Таким образом, это плохой стиль
использовать аргументы для функций, чтобы вызвать побочные эффекты. В то время как в C это
Обычно используется форма foo (x = y) для вызова foo со значением y
и одновременно присвоить значение у х этому же стилю
не следует использовать в R. Нет никаких гарантий, что аргумент
когда-либо оцениваться, и, следовательно, назначение может не состояться.