[R] problem in do.call function
Duncan Murdoch
murdoch.duncan at gmail.com
Mon Aug 8 14:28:55 CEST 2011
On 08/08/2011 8:21 AM, Duncan Murdoch wrote:
> On 08/08/2011 4:34 AM, Kathie wrote:
> > Dear all,
> >
> > I am trying to use "do.call", but I don't think I totally understand this
> > function.
> >
> > Here is an simple example.
> >
> > --------------------------------------------
> >
> > > B<- matrix(c(.5,.1,.2,.3),2,2)
> > > B
> > [,1] [,2]
> > [1,] 0.5 0.2
> > [2,] 0.1 0.3
> > > x<- c(.1,.2)
> > > X<- cbind(1,x)
> > > X
> > x
> > [1,] 1 0.1
> > [2,] 1 0.2
> > >
> > > lt<- expand.grid(i=seq(1,2), y0=seq(0,2))
> > > lt
> > i y0
> > 1 1 0
> > 2 2 0
> > 3 1 1
> > 4 2 1
> > 5 1 2
> > 6 2 2
> > >
> > > fc<- function(y0,i) dpois(y0, exp(rowSums(t(X[i,])*B[,1])))
> > >
> > > do.call(fc,lt)
> > [1] 1.892179e-09 3.348160e-01 3.800543e-08 3.663470e-01 3.816797e-07
> > 2.004237e-01
> >
> > --------------------------------------------
> >
> > Unfortunately, what I want to get is
> >
> > dpois(0, exp(rowSums(t(X[1,])*B[,1]))) = 0.1891356
> > dpois(0, exp(rowSums(t(X[2,])*B[,1]))) = 0.1859965
> > dpois(1, exp(rowSums(t(X[1,])*B[,1]))) = 0.3149658
> > dpois(1, exp(rowSums(t(X[2,])*B[,1]))) = 0.3128512
> > dpois(2, exp(rowSums(t(X[1,])*B[,1]))) = 0.2622549
> > dpois(2, exp(rowSums(t(X[2,])*B[,1]))) = 0.2631122
> >
> > --------------------------------------------
> >
> > Would you plz tell me why these two results are different?? and how do I get
> > what I want to using "do.call" function??
>
> Your function expects arguments in the order y0, i, but you are passing
> them in the order i, y0. Change the header of your function or the
> order of the columns in lt.
Sorry, that's the wrong explanation of the problem. Since you were
using a dataframe, the arguments are named, and the order doesn't matter.
The problem is that your function fc can't handle vector arguments.
Your "do.call(fc, lt)" is the same as fc(i=lt$i, y0=lt$y0), and that
won't work. You really want some version of apply, or to use Vectorize
on your function. For example,
> fc <- Vectorize(fc)
> fc(i=lt$i, y0=lt$y0)
[1] 0.1891356 0.1859965 0.3149658 0.3128512 0.2622549 0.2631122
Duncan Murdoch
More information about the R-help
mailing list