[R] do.call with Vectorial Argument

Duncan Murdoch murdoch at stats.uwo.ca
Tue Oct 3 17:08:29 CEST 2006


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 at 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.



More information about the R-help mailing list