我设置了一些环境变量:
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
答案 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