Re: [R] do.call with Vectorial Argument

From: Duncan Murdoch <murdoch_at_stats.uwo.ca>
Date: Tue 03 Oct 2006 - 15:08:29 GMT

On 10/3/2006 10:46 AM, Lorenzo Isella wrote:
> Dear All,
> I am trying to use the do.call command to avoid tedious loops in R
> when I need to call repetitively a function.

That's probably not the best choice. You might want to think about writing a wrapper for the function instead; you'll end up with easier code to read and debug.

> I am experiencing a problem when the arguments of a function are given
> with a vector (I need to express then this way to be able later on to
> integrate them numerically with the adapt package).
> Consider the small script:
>
> remove(list=ls())
> #library(adapt)
>
> # first a list of the parameters
>
> tau<-0.1
> beta<-1/tau
> St<-tau
> D=2e-2
> q<-2*beta^2*D
> lam1<- -beta/2*(1+sqrt(1-4*St))
> lam2<- -beta/2*(1-sqrt(1-4*St))
> x0<- 0
> vx0<- 1
>
> # fist a function with scalar parameters
>
> sigma_pos_old<-function(t,q,lam1,lam2)
> {
> q/(lam1-lam2)^2*(
> (exp(2*lam1*t)-1)/(2*lam1)-2/(lam1+lam2)*(exp(lam1*t+lam2*t)-1) +
> (exp(2*lam2*t)-1)/(2*lam2) )
> }
>
> # now the same function where the only argument t is given as a 1x1 vector
>
> sigma_pos<-function(myargs)
> {
> q/(lam1-lam2)^2*(
> (exp(2*lam1*myargs[1])-1)/(2*lam1)-2/(lam1+lam2)*(exp(lam1*myargs[1]+lam2*myargs[1])-1)
> + (exp(2*lam2*myargs[1])-1)/(2*lam2) )
> }
>
> # Now I use do.call
>
>
> newtime<-seq(1,5,len=1001)
>
> mypar<-c(q,lam1,lam2)
> sig_xx<-do.call("sigma_pos_old",c(list(t=newtime),mypar))
>
> # Now this line does not work; sig_xx2 is not a vector equal to sig_xx
>
> sig_xx2<-do.call("sigma_pos",c(list(myargs =newtime)))

Take a look at what c(list(t=newtime),mypar) gives you: it's a list of length 2. You want a list of length 4.

To get that, just use mypar <- list(q, lam1, lam2).

Or better still, write a wrapper function, e.g.

better_sigma <- function() {

   sigma_pos_old(t, q, lam1, lam2)
}

Remember that better_sigma will look up the variables t, q, lam1, and lam2 in whatever environment it was defined in, so if you have a function that modifies local copies of those variables and then calls better_sigma, you should define better_sigma within that function.

Duncan Murdoch
>
>
>
>
> So I am making some mistake with the do.call command, since I get a
> single value rather than a vector.
> Can anyone tell me what I am doing wrong? I tried several variations
> of the syntax, but none works the way I want.
> Kind Regards
>
> Lorenzo
>
> ______________________________________________
> R-help@stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Wed Oct 04 01:17:31 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Tue 03 Oct 2006 - 15:30:07 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.