2014-12-03 199 views
7

有沒有辦法讓foreach()返回一個指定的列表/ data.frame。例如。foreach:保留名稱

foo <- list(a = 1, b = 2) 
bar <- foreach (x = foo) %do% { x * 2 } 

返回list(2, 4)。我希望它返回list(a = 2, b = 4)

另外,有沒有辦法從循環體內訪問名稱?

(我不感興趣,其中名稱foreach循環後分配的解決方案。)

問候

+2

不確定'foreach'是否具有此功能。然而,你可以改變你的循環爲'foreach(i = seq_along(foo)){x < - foo [[i]]; ...}'這將允許您通過'names(foo)[i]'訪問每個元素的名稱' – konvas 2014-12-03 16:13:56

+0

您也可以使用'x = Map(structure,.Data = lapply(foo,list) names(foo))'來獲取循環內的名字,就好像循環使用'['而不是'[['來訪問'foo'的元素。 – 2014-12-03 16:24:25

回答

9

我用您的解決方案,直到我需要使用嵌套的foreach(與%:%運營商)。我想出了這個:

foo <- list(a = 1, b = 2) 
bar <- foreach (x = foo, .final = function(x) setNames(x, names(foo))) %do% { 
    x * 2 
    } 

訣竅是使用.final參數(這就是最終的結果應用於一次函數)來設置的名稱。這更好,因爲它不使用臨時變量,並且整體更清潔。它可以與嵌套列表一起使用,以便可以在結構的幾個層中保留名稱。

請注意,這隻有在foreach的參數爲.inorder=T(這是默認值)時才能正常工作。

3

感謝您的建議。這是我想出了:

foo <- list(a = 1, b = 2) 
bar <- foreach (x = foo, n = names(foo), .combine = c) %do% { 
    rv <- list() 
    rv[[n]] <- x * 2 
    rv 
}