From tplate at blackmesacapital.com  Mon Aug 11 10:33:15 2003
From: tplate at blackmesacapital.com (Tony Plate)
Date: Mon Aug 11 17:33:10 2003
Subject: [Rd] Wish (PR#3690)
In-Reply-To: <200308081350.h78DoTJH023394@pubhealth.ku.dk>
Message-ID: <5.2.1.1.2.20030808154210.046f99c8@mailhost.blackmesacapital.com>

When I want apply() to always return a matrix, no matter whether the 
returned value from the applied function is a single value or a 
multi-element vector, I often use rbind() or cbind() along the lines of the 
following:

 > # Some example data:
 > x <- rbind(1:3,7:9)
 > x
      [,1] [,2] [,3]
[1,]    1    2    3
[2,]    7    8    9

 > # The problem -- different shaped result depending on whether the 
applied function returns a single value or a matrix:
 > apply(x, 1, min)
[1] 1 7
 > apply(x, 1, c)
      [,1] [,2]
[1,]    1    7
[2,]    2    8
[3,]    3    9
 >

 > # A solution:
 > do.call("rbind", unlist(apply(x, 1, function(row) list(row)), rec=F))
      [,1] [,2] [,3]
[1,]    1    2    3
[2,]    7    8    9
 > do.call("rbind", unlist(apply(x, 1, function(row) list(min(row))), rec=F))
      [,1]
[1,]    1
[2,]    7
 >
 > # Beware that the above manner of calling apply() can preclude some 
potential optimizations that could otherwise be performed by the 
implementation of apply() (but, as far as I am aware, these are not 
performed in the current version of R).

There would be of course many other ways of ensuring that your result is of 
a particular shape, some possibly more efficient, e.g., using matrix() with 
the appropriate nrow or ncol arguments.

It would be difficult to add any new arguments to apply() because apply() 
passes arguments it doesn't recognize down the supplied function.  If a new 
argument were added to apply(), especially one with a common name like 
drop, that could break existing code that depended on that argument being 
passed to the applied function.  It would probably make more sense to add 
to the apply() family a new function that was designed to work in a regular 
way with arrays with any number of dimensions, and I'm sure there would be 
many opinions on what features that function should have (I would argue 
that it should preserve the ordering of dimensions so that, for instance, 
the call analogous to apply(x, 1, c) returned x rather than the transpose 
of x.)

-- Tony Plate

At Friday 03:50 PM 8/8/2003 +0200, a.buness@dkfz.de wrote:
>Full_Name: Andreas Buness
>Version: 1.7.1
>OS: Unix
>Submission from: (NULL) (193.174.53.122)
>
>
>I would like to ask you to enhance the apply function
>with an option drop=FALSE similar to the one existing
>for subsetting of arrays. Or any other mechanism to get
>control on the dimensionality of an object resulting
>from an apply call. This could facilitate more robust
>programming.
>
>______________________________________________
>R-devel@stat.math.ethz.ch mailing list
>https://www.stat.math.ethz.ch/mailman/listinfo/r-devel


[Rd] Wish (PR#3690)
Tony Plate