2016-08-22 88 views
1

我在循環中使用下面的代碼,我只是複製了我面臨問題的部分。整個代碼非常長,並且我已經刪除了在兩者之間運行良好的部分這些線。這只是說明問題:在r中替代分配函數

for (j in 1:2) 
    { 
     assign(paste("numeric_data",j,sep="_"),unique_id) 
     for (i in 1:2) 
     { 
     assign(paste("numeric_data",j,sep="_"), 
       merge(eval(as.symbol(paste("numeric_data",j,sep="_"))), 
       eval(as.symbol(paste("sd_1",i,sep="_"))),all.x = TRUE)) 
     } 
     } 

,我現在面臨的問題是不是在第二步中分配,我想

for (j in 1:2) 
    { 
     assign(paste("numeric_data",j,sep="_"),unique_id) 
     for (i in 1:2) 
     { 
     eval(as.symbol((paste("numeric_data",j,sep="_"))))<- 
       merge(eval(as.symbol(paste("numeric_data",j,sep="_"))), 
       eval(as.symbol(paste("sd_1",i,sep="_"))),all.x = TRUE) 
     } 
     } 

但是[R不使用(EVAL +粘貼)在分配新變量時不接受eval。我看了論壇,並且無處不在分配建議解決問題。但是,如果我使用assign循環覆蓋我以前生成的「numeric_data」而不是添加到它,因此我得到的只有一個值的輸出,而不是兩者。

+1

我不確定我會考慮使用'eval'「normal」。 – nrussell

+0

當然,讓我刪除該註釋 – Shaz

+0

您不必刪除它;我的意思是,你爲什麼要特意使用'eval'? – nrussell

回答

2

這是R中最基本的數據結構的一個非常基本的介紹。我強烈建議在標準文檔資源中閱讀更多關於它們的內容。

#A list is a (possible named) set of objects 
numeric_data <- list(A1 = 1, A2 = 2) 
#I can refer to elements by name or by position, e.g. numeric_data[[1]] 
> numeric_data[["A1"]] 
[1] 1 

#I can add elements to a list with a particular name 
> numeric_data <- list() 
> numeric_data[["A1"]] <- 1 
> numeric_data[["A2"]] <- 2 
> numeric_data 
$A1 
[1] 1 

$A2 
[1] 2 

#I can refer to named elements by building the name with paste() 
> numeric_data[[paste0("A",1)]] 
[1] 1 

#I can change all the names at once... 
> numeric_data <- setNames(numeric_data,paste0("B",1:2)) 
> numeric_data 
$B1 
[1] 1 

$B2 
[1] 2 

#...in multiple ways 
> names(numeric_data) <- paste0("C",1:2) 
> numeric_data 
$C1 
[1] 1 

$C2 
[1] 2 

基本上,教訓是,如果你有帶數字後綴名稱的對象:object_1object_2,等他們應該幾乎總是在一個列表元素與名稱,你可以輕鬆地構建和參考至。

+0

我跳過圖片:D + 1,儘管這可能不回答OP的問題。但我想它指向了正確的方向。 – RHertel

+1

@RHertel找出一種方法來幫助那些編碼自己進入這個角落的人對我來說一直是一個難題。我試着回答很多不同的方式,但可能唯一真正的方法就是坐在鍵盤上,一起看整個代碼。 – joran

+0

它沒有回答我的問題,但它給了我一個不同的想法來解決問題 – Shaz