Порядок видимости '=' и '<-' внутри функции в R - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь понять, как R определяет переменные внутри функции. Почему на выходе 12? Почему не 4? Как a & b назначается здесь

Я учу R. Пожалуйста, объясните с некоторыми ссылками

f1 <- function(a = {b <- 10; 2}, b = 2) {
  a+b
}

f1()

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Это объяснено в разделе 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. Нет никаких гарантий, что аргумент когда-либо оцениваться, и, следовательно, назначение может не состояться.

0 голосов
/ 22 января 2019

См. https://www.rdocumentation.org/packages/base/versions/3.5.2/topics/assignOps введите описание ссылки здесь

Попробуйте это

f1 <- function(a = {b <= 10; 2}, b = 2) {

  a+b
}

f1()

или

f1 <- function(a = {b <<- 10; 2}, b = 2) {

      a+b
    }

    f1()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...