添加两个列表的所有元素

Spa*_*man 8 r

假设我有两个列表,列表的相应元素是相同的形状:

 e1=list(1,c(1,2,3),matrix(1:12,3,4))
 e2=list(1,c(1,2,3),matrix(1:12,3,4))
Run Code Online (Sandbox Code Playgroud)

我想逐个元素地添加这两个列表.这是我的解决方案,适用于任何长度的列表和任何形状的元素,只要它们匹配并且是可添加的:

> esum
function(e1,e2){
  e = list()
  for(i in 1:length(e1)){
    e[[i]]=e1[[i]]+e2[[i]]
  }
  e
}
> esum(e1,e2)
Run Code Online (Sandbox Code Playgroud)

但它看起来很丑陋,而且可能是一种可以在单行中完成的事情.

这是问题的第一阶段,实际上是要添加许多这些列表的完整列表,但是一旦定义了esum,它只是Reduce:

 > ee = list(e1,e2,e1,e1,e2)
 > Reduce(esum,ee)[[3]]  # lets just check [[3]] for now
      [,1] [,2] [,3] [,4]
 [1,]    5   20   35   50
 [2,]   10   25   40   55
 [3,]   15   30   45   60
Run Code Online (Sandbox Code Playgroud)

那么,任何人都有这样的单线程?

是的我知道单行并不总是最好的东西.

Ben*_*ker 18

就像是

   mapply("+",e1,e2)
Run Code Online (Sandbox Code Playgroud)

适用于第一部分......

Reduce( function(x,y) mapply("+",x,y),ee)[[3]]
Run Code Online (Sandbox Code Playgroud)

可能有些东西更加光滑.Reduce没有...争论,所以我们无法逃脱Reduce(mapply,ee,FUN="+")[[3]]

  • FYI`Map`通常比`mapply`更安全,因为它总是返回一个列表. (3认同)
  • 酷解!你可以使用`esum < - function(...)mapply("+",...)`将`esum`定义为高阶函数,然后再做`Reduce(esum,ee)` (2认同)