# [R] Pass vector as multiple parameters (as in python f(*x))

arun smartpink111 at yahoo.com
Sat Jan 26 03:17:06 CET 2013

HI,

You could use ?Reduce() also in the second case:
lapply(vs,function(v){Reduce(f,as.list(v))})
#[[1]]
#[1] 10

#[[2]]
#[1] 6

#[[3]]
#[1] 1
A.K.

----- Original Message -----
From: Carlos Pita <carlosjosepita at gmail.com>
To: r-help at r-project.org
Cc:
Sent: Friday, January 25, 2013 7:46 PM
Subject: Re: [R] Pass vector as multiple parameters (as in python f(*x))

Thanks Bert, do.call is exactly what I was looking for. What in lisp
is apply and in python f(*v).

> Your whole premise that the arguments of a function should be mappable to elements of a vector seems contrary to good R programming practice.

Jeff I didn't pretend to imply that the mapping should by always
possible. lists for positional arguments and named lists for named
arguments would do the trick most of the times. It's pretty common in
dynamic languages.

That said, the specific task I have in mind is to index an array of an
arbitrary dimension n by a list of length n vectors, each one
representing <x1,...,xn> coordinates.

For example, if n=2, the array is the matrix m, and the list of vectors is vs:

m=matrix(1:16,4)
vs = list(c(2,3),c(2,2),c(1,1))

Then do.call would allow me to index m as follows:

lapply(vs, function(v) { do.call(`[`, append(list(m), v)) })

Alternatively:

f = function (...) { m[...] }
lapply(vs, function(v) { do.call(f, as.list(v)) })

Of course, I could just do m[v[1],v[2]] in this case, but the point is
that the dimension n would be a parameter of my function, not a
constant.

But if you know of a better or more r-esque solution I would be very

Best regards
--
Carlos

Best regards
--
Carlos

Consider changing the called function's handling of arguments instead
to accept the vector of data directly if a vector makes sense, or to a
list if the arguments have a variety of types.
> ---------------------------------------------------------------------------
> Jeff Newmiller                        The     .....       .....  Go Live...
> DCN:<jdnewmil at dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
>                                       Live:   OO#.. Dead: OO#..  Playing
> Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
> /Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k
> ---------------------------------------------------------------------------
> Sent from my phone. Please excuse my brevity.
>
> Carlos Pita <carlosjosepita at gmail.com> wrote:
>
>>Hi,
>>
>>I want to know if it's possible to pass a vector v=c(x,y,...) to a
>>function f(x,y,...) so that each vector element corresponds to a
>>formal argument of the function. For python programmers: f(*v).
>>
>>Specifically, what I'm trying to achieve is: given a list of
>>coordinates l=list(c(x1,y1,z1), c(x2,y2,z2),...) I would like to
>>obtain the corresponding elements in some array A (3-dim in this
>>case). That is: A[x1,y1,z1], A[x2,y2,z2],....
>>
>>One way would be to transform l=list(c(x1,y1,z1), c(x2,y2,z2),...) to
>>l2=list(c(x1,x2,...),c(y1,y2,...),c(z1,z2,...)) and then (if this is
>>possible at all) execute the equivalent to A[*l2].
>>
>>Another way would be to lapply function(xyz) { A[*xyz] } to each
>>coordinate vector in l. In any case I need the f(*v) equivalent.
>>
>>Please take into account that, despite the 3-dim example, I need to
>>implement the above to accept n-dim vectors for arbitrary n, so
>>something like x<-xyz[1], y<-xyz[2], z<-xyz[3] wouldn't fit the bill.
>>
>>Any other suggested solution would be appreciated.
>>
>>Best regards
>>--
>>Carlos
>>
>>______________________________________________
>>R-help at r-project.org mailing list
>>https://stat.ethz.ch/mailman/listinfo/r-help
>>http://www.R-project.org/posting-guide.html
>>and provide commented, minimal, self-contained, reproducible code.
>

______________________________________________
R-help at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help