Доступ к переменным, переданным или определенным в родительской функции R - PullRequest
0 голосов
/ 14 октября 2019

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

Это неКажется, это тот случай, когда переменные передаются в функции:

Foo <- function (y) {
  message('In Foo, x = ', x)
}

Func1 <- function (x = 1) {
  message('In Func1, x = ', x)
  Foo(1)
  lapply(1:2, Foo)
}

Func2 <- function () {
  x <- 2
  message('In Func2, x = ', x)
  Foo(1)
}

Func1(x = 1) # Foo throws error
Func2() # Foo throws error
x <- 99 
Func2() # Now Foo uses value of x from global environment


remove(x)

Как включить функцию Foo для поиска родительской функции и ее родителей по значению переменной вместо использованиязначение в глобальной среде?

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

Проблема заключается в том, что Foo определено в глобальной среде.

Добавление строки

  environment(Foo) <- environment()

перед вызовом Foo в Func1 и Func2 приводит к желаемому поведению.

1 голос
/ 14 октября 2019

Вы хотите искать переменные в стеке вызовов , а не в окружающей среде (динамическая область видимости). Вы можете использовать dynGet в Foo, который ищет объект в вызывающих, то есть sys.frame () функции. dynGet() несколько экспериментально. Используйте с осторожностью.

Foo <- function (y) {
  message('In Foo, x = ', dynGet("x", inherits = TRUE))
}

См. Также: Функциональные среды

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