2014-12-03 107 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 
}