[R] problem with do.call
Peter Dalgaard BSA
p.dalgaard at biostat.ku.dk
Wed Apr 10 14:11:03 CEST 2002
Ernesto Jardim <ernesto at ipimar.pt> writes:
> Hi
>
> I'm writing a function that uses four parameters (scalars) and I need to
> run it in an iterative process (the parameters vary to find the minimum
> RSS).
>
> I don't want to use loops and so tried the do.call function. However it
> didn't work. My understanding is that the do.call simple runs the
> function replacing the arguments (scalars by vectors), instead of runing
> the function for each set of scalars in the list, what I need.
>
> Can you please tell me if there is another way of doing it whithout
> using the for loop ?
That's not what do.call does. It is for situations where the argument
list of a single call needs to be constructed from simpler components.
Your example is equivalent to fun(a=c(1:6), b=rnorm(6))
The loop over multiple parallel vectors is only doable via something
like lapply(1:6, function(i)fun(a[i],b[i]))
However, I recently played with this and got as far as this:
napply <-
function(..., FUN) {
FUN <- match.fun(FUN)
x <- list(...)
lens <- sapply(x,length)
len <- max(lens)
if (any(lens != len))
x <- lapply(x, rep, length=len)
tuples <- lapply(seq(length=len), function(i)lapply(x,"[", i))
sapply(tuples, function(t)eval(as.call(c(FUN,t))))
}
> napply(a=c(1:6),b=rnorm(6), FUN=fun)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1.0259135 NaN 3.003882 NaN NaN 20.299212
[2,] NaN 1.977696 3.026111 NaN 3.951746 19.107481
[3,] 1.1840499 2.024837 NaN 8.289768 NaN 7.479917
[4,] 0.9756922 2.003576 NaN NaN 4.236000 NaN
[5,] 1.0010550 2.006045 NaN NaN NaN 1302.330425
[6,] NaN NaN NaN 2.472650 NaN NaN
[7,] NaN 2.094956 NaN NaN NaN 3.685879
[8,] 0.8646628 NaN 2.993435 NaN 3.369501 NaN
[9,] NaN 2.044915 3.006433 6.426090 6.123980 19.235790
[10,] 1.6051736 NaN 3.011986 NaN 3.638641 NaN
....
> > fun
> function(a,b){
>
> vec <- rnorm(25)
> res <- a*vec^b
> res
>
> }
> > fun(2,3)
> [1] 7.006278e+00 3.515010e-01 7.989718e+00 -3.377766e-02
> -1.879471e-02
> [6] -2.920680e-01 1.174834e+00 -1.088638e-03 6.448725e+00
> 2.591805e+00
> [11] -4.313672e-04 -9.171867e-03 -6.793569e+00 -2.480562e+01
> -1.514828e+01
> [16] -1.259896e-01 -7.504192e-02 6.647855e-02 5.609645e-01
> 1.093114e-01
> [21] 1.802123e+00 7.650033e-03 -3.534951e+00 -2.028473e-03
> -2.837360e+01
> > do.call("fun",list(a=c(1:6),b=rnorm(6)))
> [1] 1.4766338 NaN 3.0214852 3.8132530 0.2753699 NaN
> [7] NaN NaN 2.9998547 NaN NaN 6.3050385
> [13] 0.5970596 0.8722498 2.9931344 4.0664852 NaN NaN
> [19] 2.8121803 NaN 2.9989127 NaN NaN NaN
> [25] 14.4631627
> Warning messages:
> 1: longer object length
> is not a multiple of shorter object length in: vec^b
> 2: longer object length
> is not a multiple of shorter object length in: a * vec^b
> >
--
O__ ---- Peter Dalgaard Blegdamsvej 3
c/ /'_ --- Dept. of Biostatistics 2200 Cph. N
(*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk) FAX: (+45) 35327907
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
More information about the R-help
mailing list