Carlos Pita
2013-Jan-25 23:50 UTC
[R] Pass vector as multiple parameters (as in python f(*x))
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
Bert Gunter
2013-Jan-26 00:12 UTC
[R] Pass vector as multiple parameters (as in python f(*x))
Well, of course the answer is yes (it always is!). I'm just not sure what the question is. However, I believe you want something like do.call(the_function, parameter_list). ?do.call ## for details. Note that if v is really a (named) vector, it can be converted to a list via as.list(). Cheers, Bert On Fri, Jan 25, 2013 at 3:50 PM, 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 > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.-- Bert Gunter Genentech Nonclinical Biostatistics Internal Contact Info: Phone: 467-7374 Website: http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
Jeff Newmiller
2013-Jan-26 00:13 UTC
[R] Pass vector as multiple parameters (as in python f(*x))
Your whole premise that the arguments of a function should be mappable to elements of a vector seems contrary to good R programming practice. 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 >PLEASE do read the posting guide >http://www.R-project.org/posting-guide.html >and provide commented, minimal, self-contained, reproducible code.