Возможно, вам нужна нестандартная оценка. Это обычно включает 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
Вы можете использовать ' get' с 'envir', указанным для получения объекта из' my.env'. Пожалуйста, покажите воспроизводимый пример, чтобы другие могли понять, почему вы не можете использовать 'my.env $ foo' – akrun