2014-02-07 211 views
0

我知道函數get可以幫助您將值轉換爲變量名稱,如get(test[1])。但是我發現它們在列表格式中不兼容。看下面的例子:在R中,如何使用值作爲變量名稱

> A = c("obj1$length","obj1$width","obj1$height","obj1$weight") 
> obj1 <- NULL 
> obj1$length=c(1:4);obj1$width=c(5:8);obj1$height=c(9:12);obj1$weight=c(13:16) 
> get(A[1]) 
Error in get(A[1]) : object 'obj1$length' not found 

在這種情況下,我該如何檢索變量名?

+0

名稱(OBJ1)[1]將得到的變量名'長度' –

+0

我不明白你如何看待'get'工作。變量名稱是'obj1 $ length'。使用你的代碼,獲得'obj1 $ length'的正確方法就像get('obj1')$ length'。不過,我不知道你爲什麼要這樣做。 – rawr

回答

2

get不一樣,你需要指定變量和環境(該列表將強制使用一個)獨立工作:

get("length",obj1) 
[1] 1 2 3 4 

與你擁有的數據做它,你需要使用evalparse

eval(parse(text=A[1])) 
[1] 1 2 3 4 

不過,我建議你重新考慮你的解決問題的方法爲getevalparse是以後會咬你生硬的工具。

0

我認爲eval()函數將會訣竅,除其他用途。

的eval(A [1])

> [1] 1 2 3 4

你也可以找到有用的這個簡單的函數I實現(基於在常用的組合的eval,解析,貼):

評估<功能全(...,ENVIR = .GlobalEnv){的eval(解析(文=膏(... 09月= 「」)),ENVIR = ENVIR)}

它連接並評估幾個字符類型的對象。如果你希望它另一個函數內使用,加在你的函數的開頭

ENVIR < - 環境()

,並使用它像這樣:

評估( [some character objects],envir = envir)

試試吧,例如

myvariable1 < - 「aaa」; myvariable2 < - 「bbb」; aaa < -15; bbb < -3

評估(myvariable1,「*」,myvariable2)。

當我必須評估具有多個變量的相似句子,或者我想用自動生成的名稱創建變量時,我發現它非常有用。

爲(I在1:100){評估( 「可變的」,I, 「< -2 *」,i)}其中

+1

如果這個函數真的存在並且按你說的做,你至少需要說明它是什麼包。 – joran

+0

我的錯誤,@joran。我使用我自己的函數來評估包含我命名的字符和對象,並且我感到困惑了一會兒。無論如何,這是它,如果它可以幫助任何人: 評估<-function(...,envir = .GlobalEnv){eval(解析(text = paste(...,sep =「」)),envir = envir)} – Rufo

+0

@Rufo:我認爲你應該在你的實際答案中加入你的'評估';我想這可能確實是一個有用的包裝。另外,你能解釋一下'...'的縮進用法嗎?例如。 '評估(A [1],A [2])'不符合我的預期。也許你打算'lapply(list(...),eval)'等等? –

相關問題