[R] Seeking help on Vectorize()

Duncan Murdoch murdoch.duncan at gmail.com
Thu Jun 3 15:59:09 CEST 2010


Megh Dal wrote:
> Dear falks, here I have written following function :
>  
> fn <- Vectorize(function(x = 1:3, y = 3:6) {
>         x <- matrix(x, nrow=1)
>         y <- matrix(y, ncol=1)
>         dat <- apply(x, 2, function(xx) {
>                               apply(y, 1, function(yy) {
>                                   return(xx + yy) } ) })
>         return(dat)}, SIMPLIFY = TRUE)
>
> If I run this function, I got some warning message, even format of the returned object is not correct, for example :
>  
>   
>>   fn(x = 1:3, y = 3:7)
>>     
> [1] 4 6 8 7 9
> Warning message:
> In mapply(FUN = function (x = 1:3, y = 3:6)  :
>   longer argument not a multiple of length of shorter
>  
> However if I run individual line of codes like :
>  
>   
>> x <- 1:3; y = 3:7
>> x <- matrix(x, nrow=1)
>>          y <- matrix(y, ncol=1)
>>          dat <- apply(x, 2, function(xx) {
>>     
> +                               apply(y, 1, function(yy) {
> +                                   return(xx + yy) } ) })
>   
>> dat
>>     
>      [,1] [,2] [,3]
> [1,]    4    5    6
> [2,]    5    6    7
> [3,]    6    7    8
> [4,]    7    8    9
> [5,]    8    9   10
>
>  
> I get exactly what I want. Where I am making fault?

I think you don't understand what Vectorize is trying to do.  It is 
basically a way to run a loop, calling your function with each matching 
pair of x and y values, i.e. x=1, y=3 in the first call, then x=2 y=4 in 
the second, etc.  The warning comes because you have three x values and 
five y values, so it will repeat the 1st two x values -- but it warns 
you that's likely not what you intended.

Duncan Murdoch



More information about the R-help mailing list