Thanks again, Greg. I must have gotten up on the wrong side of the keyboard this morning and been having a spate of dim insight. What you've said here makes things clearer. DAV -----Original Message----- From: Greg Snow [mailto:538280 at gmail.com] Sent: Monday, April 16, 2012 5:42 PM To: David A Vavra Cc: r-help at r-project.org Subject: Re: [R] Effeciently sum 3d table Here is a simple example:
mylist <- replicate(4, matrix(rnorm(12), ncol=3), simplify=FALSE) A <- Reduce( `+`, mylist ) B <- mylist[[1]] + mylist[[2]] + mylist[[3]] + mylist[[4]] all.equal(A,B)
[1] TRUE Basically what Reduce does is it first applies the function (`+` in this case) to the 1st 2 elements of mylist, then applies it to that result and the 3rd element, then that result and the 4th element (and would continue on if mylist had more than 4 elements). It is basically a way to create functions like sum from functions like `+` which only work on 2 objects at a time. Another way to see what it is doing is to run something like:
Reduce( function(a,b){ cat("I am adding",a,"and",b,"\n"); a+b }, 1:10 )
The Reduce function will probably not be any faster than a really well written loop, but will probably be faster (both to write the command and to run) than a poorly designed naive loop application.
On Mon, Apr 16, 2012 at 12:52 PM, David A Vavra <davavra at verizon.net> wrote:
Thanks Greg, I think this may be what I'm after but the documentation for it isn't particularly clear. I hate it when someone documents a piece of code
saying
it works kinda like some other code (running elsewhere, of course) making the tacit assumption that everybody will immediately know what that means and implies. I'm sure I'll understand it once I know what it is trying to say. :)
There's
an item in the examples which may be exactly what I'm after. DAV -----Original Message----- From: Greg Snow [mailto:538280 at gmail.com] Sent: Monday, April 16, 2012 11:54 AM To: David A Vavra Cc: r-help at r-project.org Subject: Re: [R] Effeciently sum 3d table Look at the Reduce function. On Mon, Apr 16, 2012 at 8:28 AM, David A Vavra <davavra at verizon.net>
wrote:
I have a large number of 3d tables that I wish to sum
Is there an efficient way to do this? Or perhaps a function I can call?
I tried using do.call("sum",listoftables) but that returns a single
value.
So far, it seems only a loop will do the job. TIA, DAV
-- Gregory (Greg) L. Snow Ph.D. 538280 at gmail.com
Gregory (Greg) L. Snow Ph.D. 538280 at gmail.com