Skip to content

using list to pass argument to function

2 messages · TyagiAnupam@aol.com, Henrik Bengtsson

#
Hi,

I am trying to apply *sapply* to functions within functions within functions 
to do a Monte Carlo experiment: take Y sample of size X based on cell 
probabilities (using Brian Ripley's suggestion for drawing from contingency 
tables), for each calculate a vector of statistics, calculate bootstrap std 
errs with R replications and their means and SD. Store results in a matrix 
for further use. The problem is how to pass 3 arguments returned as c() by a 
fucntion to another  function that uses them using: sapply(rep(c(), R), 
anotherfucntion). This does not seem to work, possibly because I am passing a 
c() argument where 3 separate arguemnts are needed. What is a good way to do 
this? I am trying to avoid *for* loops.

Anupam. 
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
#
The problem is that c() is of length zero and repeating such a vector R
times will only give you a vector of length zero, e.g. length(rep(c(),
R)) == 0. I think you have observed this already. The only way to store
a repetition of empty vectors or NULL values is by using the data type
list, e.g.

  args <- rep(list(c()), R)

Then sapply(args, FUN=anotherfunction) will work, but I think you are
better of with

  lapply(args, FUN=anotherfunction) 

I am not sure if you wrote the function that returns c() or not. If not,
you can always convert a vector to a list and then make sure it has the
right length, i.e. R, by doing:

  if (length(vec) == 0)
    args <- rep(list(vec), length.out=R)
  else
    args <- rep(as.list(vec), length.out=R)

Warning, only using as.list() won't work if length(vec) == 0, but if you
know that it is not a list that is returned, which I guess you know, all
you have to do is:

    args <- rep(list(vec), length.out=R)

Finally, if R is not way too big I actually think a for loop would be
equally fast if that is your concern. Someone correct me if I am wrong,
but for loops are not penalized that much in R as for instance in
Matlab.

Cheers

Henrik Bengtsson
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._