2011-06-20 32 views
0

我已经设置一些环境变量:如何评估在环境中设置的列表中的变量名称?

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

现在我有一些这方面可变因素和一些NUMERICS列表:

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 
+0

我发布了一些让你开始思考的东西。当它是一个变量名或数字时,我不确定你的意思。你能解释一下你想调用'getNumbers()'的两种方式的例子,输入是什么以及期望的输出是什么。只需编辑您的问题即可添加示例。 –

+3

您无法按位置为环境编制索引。 R不保证环境元素的存储顺序。 – hadley

回答

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 

编辑:只是要清楚的是,如果所需要的只是按名称提取一个对象(位置位丢给我,因为这没有任何意义),那么@ @dle Ÿ在下面评论中提到,我们真正需要的是使用[[于子集环境:

R> env1[[ll[[3]]]] 
[1] 7 

我想它,如果你来包装它在一个职能是

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

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

您对''''''get'的使用有点复杂 - 为什么不直接使用子集? 'env1 [[ll [[3]]]]' – hadley

+0

@hadley - 没有理由;我没有完全得到OP的想法,认为它更简单的子集。正如你在上面的评论中所说的那样,在该环境中按位置对环境进行子集化并不合理,但我认为我并没有完全理解OP想要的内容。我同意,'()'和'get()'一起过于复杂并且导致范围问题。'get()'本身就很好,但如果所有OP的需求都是这样,那么子集的工作就很好。 –

+0

我现在用get(as.character(obj [[pos]],envir = env)做了..非常感谢 – tObi