2011-06-20 31 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