2016-01-25 3 views
0

У меня есть небольшой вопрос об окружающей среде в R. У меня есть среда (назовем ее my.env) внутри моего globalEnv, и я хотел бы определить функцию, которая будет использовать только переменные внутри my.env, поэтому я не буду называть их fun(my.env$foo), а просто fun(foo).Использование функций внутри среды и только здесь

Есть ли способ сделать это?

+0

Вы можете использовать ' get' с 'envir', указанным для получения объекта из' my.env'. Пожалуйста, покажите воспроизводимый пример, чтобы другие могли понять, почему вы не можете использовать 'my.env $ foo' – akrun

ответ

1

Возможно, вам нужна нестандартная оценка. Это обычно включает substitute.

my.env <- new.env() 
my.env$a <- 1:5 
my.env$b <- 2 

fun <- function(x, y, env = my.env) { 
    x <- eval(substitute(x), envir = env) 
    y <- eval(substitute(y), envir = env) 
    x^y 
} 

fun(a, b) 
#[1] 1 4 9 16 25 

Но обратите внимание, как eval следует путь поиска (get делает это слишком):

rm(b, envir = my.env) 
ls(my.env) 
#[1] "a" 
b <- 3 

fun(a, b) 
#[1] 1 8 27 64 125 

my.env$b <- 4 

fun(a, b) 
#[1] 1 16 81 256 625 

Если это не приемлемо, вы можете сделать это:

fun1 <- function(x, y, env = my.env) { 
    x <- env[[as.character(substitute(x))]] 
    y <- env[[as.character(substitute(y))]] 
    stopifnot(!is.null(x), !is.null(y)) 
    x^y 
} 

fun1(a, b) 
#[1] 1 16 81 256 625 
rm(b, envir = my.env) 
fun1(a, b) 
#Error: !is.null(y) is not TRUE 
+0

Спасибо! Он отлично работает, я использовал ваш третий метод :) Я увижу документ для получения дополнительной информации о замене, спасибо – BobLeGob

Смежные вопросы