[Rd] outer not applying a constant function
Martin Maechler
maechler at stat.math.ethz.ch
Tue Mar 21 09:38:24 CET 2017
>>>>> William Dunlap <wdunlap at tibco.com>
>>>>> on Mon, 20 Mar 2017 10:20:11 -0700 writes:
>> Or is this a bad idea?
> I don't like the proposal. I have seen code like the following (in
> fact, I have written such code, where I had forgotten a function was
> not vectorized) where the error would have been discovered much later
> if outer() didn't catch it.
>> outer(1:3, 11:13, sum)
> Error in outer(1:3, 11:13, sum) :
> dims [product 9] do not match the length of object [1]
> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com
You are right, thank you!
Such a "convenience change" would not be a good idea.
Martin Maechler
ETH Zurich
> On Mon, Mar 20, 2017 at 6:36 AM, Martin Maechler
> <maechler at stat.math.ethz.ch> wrote:
>>>>>>> Gebhardt, Albrecht <Albrecht.Gebhardt at aau.at>
>>>>>>> on Sun, 19 Mar 2017 09:14:56 +0000 writes:
>>
>> > Hi,
>> > the function outer can not apply a constant function as in the last line of the following example:
>>
>> >> xg <- 1:4
>> >> yg <- 1:4
>> >> fxyg <- outer(xg, yg, function(x,y) x*y)
>> >> fconstg <- outer(xg, yg, function(x,y) 1.0)
>> > Error in outer(xg, yg, function(x, y) 1) :
>> > dims [product 16] do not match the length of object [1]
>>
>> > Of course there are simpler ways to construct a constant matrix, that is not my point.
>>
>> > It happens for me in the context of generating matrices of partial derivatives, and if on of these partial derivatives happens to be constant it fails.
>>
>> > So e.g this works:
>>
>> > library(Deriv)
>> > f <- function(x,y) (x-1.5)*(y-1)*(x-1.8)+(y-1.9)^2*(x-1.1)^3
>> > fx <- Deriv(f,"x")
>> > fy <- Deriv(f,"y")
>> > fxy <- Deriv(Deriv(f,"y"),"x")
>> > fxx <- Deriv(Deriv(f,"x"),"x")
>> > fyy <- Deriv(Deriv(f,"y"),"y")
>>
>> > fg <- outer(xg,yg,f)
>> > fxg <- outer(xg,yg,fx)
>> > fyg <- outer(xg,yg,fy)
>> > fxyg <- outer(xg,yg,fxy)
>> > fxxg <- outer(xg,yg,fxx)
>> > fyyg <- outer(xg,yg,fyy)
>>
>> > And with
>>
>> > f <- function(x,y) x+y
>>
>> > it stops working. Of course I can manually fix this for that special case, but thats not my point. I simply thought "outer" should be able to handle constant functions.
>>
>> ?outer clearly states that FUN needs to be vectorized
>>
>> but function(x,y) 1 is not.
>>
>> It is easy to solve by wrapping the function in Vectorize(.):
>>
>>> x <- 1:3; y <- 1:4
>>
>>> outer(x,y, function(x,y) 1)
>> Error in dim(robj) <- c(dX, dY) :
>> dims [product 12] do not match the length of object [1]
>>
>>> outer(x,y, Vectorize(function(x,y) 1))
>> [,1] [,2] [,3] [,4]
>> [1,] 1 1 1 1
>> [2,] 1 1 1 1
>> [3,] 1 1 1 1
>>
>> ----------------
>>
>> So, your "should" above must be read in the sense
>>
>> "It really would be convenient here and
>> correspond to other "recycling" behavior of R"
>>
>> and I agree with that, having experienced the same inconvenience
>> as you several times in the past.
>>
>> outer() being a nice R-level function (i.e., no C speed up)
>> makes it easy to improve:
>>
>> Adding something like the line
>>
>> if(length(robj) == 1L) robj <- rep.int(robj, dX*dY)
>>
>> before dim(robj) <- c(dX, dY) [which gave the error]
>>
>> would solve the issue and not cost much (in the cases it is unneeded).
>>
>> Or is this a bad idea?
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
More information about the R-devel
mailing list