2015-05-20 168 views
1

我想在空中添加元素到空列表。列表中的每個元素應該在一組變量之後自動命名,這些變量的值會有所不同。基於變量名稱的名稱列表元素R

但是,我似乎無法找到一種方法來即時命名列表元素而不會出錯。考慮下面的例子:

L <- list() 

var1 <- "wood" 
var2 <- 1.0 
var3 <- "z4" 

varname <- paste(var1, as.character(var2), var3, sep="_") 

# This works fine: 
L$"wood_1_z4" <- c(0,1) 
L$"wood_1_z4" 
0 1 

# This doesn't!! 
L$paste(var1, as.character(var2), var3, sep="_") <- c(0,1) 
Error in L$paste(var1, as.character(var2), var3, sep = "_") <- c(0, 1) : 
    invalid function in complex assignment 

# Ths doesn't either ... 
L$eval(parse(text = "varname")) <- c(0,1) 
Error in L$eval(parse(text = "varname")) <- c(0, 1) : 
target of assignment expands to non-language object 

有沒有辦法做到這一點?

+4

使用'[[':'L [[paste(var1,as.character(var2),var3,sep =「_」)]] < - c(0,1)' – nicola

+0

如果賦值到'名字(L)'? –

+1

'$'在右側沒有做任何評估,因此錯誤。 –

回答

4

您不能使用<-運算符分配給paste()(我相信對於eval()函數也是如此)。相反,您需要使用[[運營商或使用names()函數。你可以這樣做,像這樣:

L <- list() 
var1 <- "wood" 
var2 <- 1.0 
var3 <- "z4" 
varname <- paste(var1, as.character(var2), var3, sep="_") 

# Using [[ 
L[[varname]] <- c(0,1) 

> L 
$wood_1_z4 
[1] 0 1 

# Using names() 
L[[1]] <- c(0,1) 
names(L)[1] <- varname 

> L 
$wood_1_z4 
[1] 0 1 

要做到這一點可能是一種更有效的方式來使用這兩個創造的價值和名稱列表元素,甚至一個剛剛創造的價值功能 - 如果你再使用sapply,您可以使用調用函數的參數和USE.NAMES選項來爲每個列表元素命名。

從一般意義上來說,當列表的最終大小和結構不是衆所周知的時候,對於隨着時間的推移增長列表而言,R並沒有真正優化。雖然可以做到,但更多的「R-ISH」方法可以提前確定結構。

+1

儘管確實無法分配到'paste'和'eval',但它不工作的原因是因爲原始'$'不在右側進行計算。根據C代碼中對'$'的註釋:_「我們需要確保只評估第一個參數,第二個是需要匹配的符號,而不是評估。」_ –

+0

今天剛剛學到了一些新東西。非常感謝! – TARehman