«с» поведением функции - PullRequest
6 голосов
/ 22 июня 2011

Может кто-нибудь объяснить, что вызывает ошибку в последней строке кода?Это ошибка?

> ll <- list(a=1, b=2)
> ee <- as.environment(ll)
> ee
<environment: 0x0000000004d35810>
> ls(ee)
[1] "a" "b"
> with(ee, a)
[1] 1
> with(ee, a - b)
Error in eval(expr, envir, enclos) : could not find function "-"
> 

Ответы [ 2 ]

15 голосов
/ 22 июня 2011

Это связано с областью видимости R Для этого нужно найти функцию "-"(). Вы сказали R, чтобы оценить ваше выражение в среде ee. Там нет функции "-"(), поэтому она перешла к родительской среде ee, которая:

> parent.env(ee)
<environment: R_EmptyEnv>

там, где нет функции "-"(). Поскольку нет родительской среды для пустой среды

> parent.env(parent.env(ee))
Error in parent.env(parent.env(ee)) : the empty environment has no parent

R отказался от поиска и выдал ошибку.

Мы можем решить эту проблему, подключив родительскую среду к ee, где R может найти функцию:

> parent.env(ee) <- .BaseNamespaceEnv
> with(ee, a - b)
[1] -1

Но я думаю, что было бы более естественным установить родителя ee в качестве глобальной среды:

> parent.env(ee) <- globalenv()
> with(ee, a - b)
[1] -1

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

5 голосов
/ 22 июня 2011

Функция - не видна из созданной вами среды.

Если вы назначите его там,

ee$`-` <- `-`

тогда ваш пример сработает.

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