[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