如何评估环境中设置的列表中的变量名称?

时间:2011-06-20 22:09:44

标签: r

我设置了一些环境变量:

envir1 <- new.env()
assign("a", 7, envir=envir1)
assign("b", 8, envir=envir1)
assign("x", 9, envir=envir1)

现在我有一个列表,其中包含一些变量和一些数字:

lis <- list(1,2, as.name("a"), 5, as.name("x"))

如何以两种方式获取数值,当它是变量名称时,以及何时是数字

getNumbers2 <- function(li,pos) {
    ## Part where i dont know  
    return(li[[pos]]) ## dont works. the name of the variable is returned
}

getNumbers <- function(li,pos, env1) {
    environment(getNumbers2) <- env1
    getNumbers2(li,pos)
}

getNumbers(lis, 3, envir1)
a ## << wanna have 7 here

1 个答案:

答案 0 :(得分:3)

为什么要将"a""x"存储为R符号?:

R> str(l[[3]])
 symbol a

如果你刚刚完成:

env1 <- new.env()
assign("a", 7, envir=env1)
assign("b", 8, envir=env1)
assign("x", 9, envir=env1)
ll <- list(1, 2, "a", 5, "x")

然后这个

with(env1, get(ll[[3]]))

会起作用:

R> with(env1, get(ll[[3]]))
[1] 7

但由于范围问题,这在函数内部不起作用。

然而,看到with(env1, get(ll[[3]]))有效,您可能不需要该功能。另请注意,get()将环境作为参数:

R> get(ll[[3]], envir = env1)
[1] 7

所以我们可以把函数写成

getNumbers <- function(obj, pos, env) {
    get(obj[[pos]], envir = env)
}

哪种方法有效:

R> getNumbers(ll, 3, env1)
[1] 7

编辑:要明确的是,如果所需要的只是按名称提取对象(位置位告诉我,因为这没有任何意义),那么,作为@hadley在下面的评论中提到,我们真正需要的是使用[[

对环境进行分组
R> env1[[ll[[3]]]]
[1] 7

我想,如果你希望将它包装在一个函数中,那么

getNumbers <- function(obj, pos, env) {
    env[[obj[[pos]]]]
}

R> getNumbers(ll, 3, env1)
[1] 7