Как оценить имена переменных в списке, которые установлены в среде? - PullRequest
0 голосов
/ 21 июня 2011

Я установил некоторые переменные окружения:

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 Ответ

3 голосов
/ 21 июня 2011

Почему вы храните "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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...