【问题标题】:Converting lapply to foreach?将 lapply 转换为 foreach?
【发布时间】:2015-12-12 06:09:46
【问题描述】:

我希望使用foreach 包将第二个lapply 函数(# Make the new list) 转换为foreach 循环。

## Example data
lst <- lapply(1:30, function(x) lapply(1:5, function(y) rnorm(10)))

## Make the new list
res <- lapply(1:5, function(x) lapply(1:10, function(y) sapply(lst, function(z) z[[x]][[y]])))

我不确定这是否可能。我不担心lapply 的性能优于foreach 循环。对于上下文,我正在以这种方式重新组织向量列表的列表:

new_thing[[5]][[10]][30] <- daily_by_security[[30]][[5]][10]

谢谢!

【问题讨论】:

  • 仅供参考,使用(嵌套)replicate 可以更优雅地重写第一条语句。

标签: r foreach apply lapply


【解决方案1】:

为了弄清楚如何解决您的问题,我查看了 foreach 示例,而第二个示例正是您正在寻找的:

library("foreach")
example(foreach)

# equivalent to lapply(1:3, sqrt)
foreach(i=1:3) %do%  sqrt(i)

然后我根据您的问题对此进行了调整:

lst <- lapply(1:30, function(x) lapply(1:5, function(y) rnorm(10)))
resFE <- foreach(i = 1:5) %do% 
                 lapply(1:10, function(y) sapply(lst, function(z) z[[i]][[y]]))

编辑: OP 能够根据我的工作找出解决方案。这是解决方案:

resFE <- foreach(i = 1:5, .packages = "foreach") %dopar% 
                 { foreach(m = 1:10) %dopar% 
                    { foreach(t = lst, .combine = c) %do% 
                     { t[[i]][[m]] } } }

【讨论】:

  • 谢谢!这很有帮助。我希望根本不使用任何应用功能。你知道如何将这个:sapply(lst, function(z) z[[i]][[m]]) 更改为 foreach 吗?
  • 不客气。我得跑了,但看看这个vignette。如果我有时间的话,我今晚会再看一遍。我认为它可以满足您的需求。
  • 你有没有机会去看看?我还是有一些麻烦。
  • 我已经做到了。这是代码:resFE &lt;- foreach(i = 1:5, .packages = "foreach") %dopar% { foreach(m = 1:10) %dopar% { foreach(t = lst, .combine = c) %do% { t[[i]][[m]] } } }
  • 很高兴你能弄明白!我将您的解决方案添加到我的答案中
猜你喜欢
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 2022-11-22
相关资源
最近更新 更多