как изолировать функцию - PullRequest
7 голосов
/ 02 ноября 2011

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

Я бы хотел, чтобы следующий код выдал ошибку. Причина в том, что я мог набрать z (я хотел набрать y).

z <- 10
temp <- function(x,y) {
        y <- y + 2
        return(x+z)
}
> temp(2,1)
[1] 12

Я предполагаю, что ответ связан со средой, но я еще не понял их.

Есть ли способ установить желаемое поведение по умолчанию (например, установив опцию)?

Ответы [ 3 ]

5 голосов
/ 02 ноября 2011
> library(codetools)
> checkUsage(temp)
<anonymous>: no visible binding for global variable 'z'

Функция не меняется, поэтому нет необходимости проверять ее каждый раз, когда она используется. findGlobals является более общим и немного более загадочным. Что-то вроде

Filter(Negate(is.null), eapply(.GlobalEnv, function(elt) {
    if (is.function(elt))
        findGlobals(elt)
}))

может посещать все функции в среде, но если есть несколько функций, возможно, пришло время подумать о написании пакета (это не так сложно).

5 голосов
/ 02 ноября 2011
environment(temp) = baseenv()

См. Также http://cran.r -project.org / doc / manual / R-lang.html # Область переменных и ?environment.

2 голосов
/ 02 ноября 2011
environment(fun) = parent.env(environment(fun))

(я использую 'fun' вместо имени вашей функции 'temp' для ясности)

Это удалит среду "рабочей области" (.GlobalEnv) из пути поиска и оставитвсе остальное (например, все пакеты).

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