Dear Baptiste, > I know I have seen this discussed before but I haven't been successful > in searching for "ellipsis", "dots", "..." in the archives. I would > like to filter "..." arguments according to their name, and dispatch > them to two sub-functions, say fun1 and fun2. I looked at lm() but it > seemed more complicated than I need as it modifies the calling > function among other things. What is the best approach for this? My > current version presented below seems very awkward. > > Best regards, > > baptiste > > sessionInfo() > R version 2.9.2 (2009-08-24) > i386-apple-darwin8.11.1 > > fun1 <- function(col, row){ > print(col) > print(row) > } > > fun2 <- function(x){ > print(x) > } > > foo <- function(..., lty=1){ > > dots <- list(...) > > cl <- match.call() > > col <- eval.parent(cl$col) > row <- eval.parent(cl$row) > > params.fun1 <- c("col", "row") > > removed <- na.omit(match(names(cl), params.fun1)) > # index whichever arguments were passed to fun1 > > fun1(col, row) > > fun2(dots[seq_along(dots)[-removed]])
Instead of passing all remaining arguments stacked into one list (= 1 argument x to function fun2) you might want to be able to retain them as distinct arguments; so you might want to replace fun2 by fun2.a <- function(...) print(list(...)) and the call to fun2 in foo by do.call(fun2.a, dots.remaining) where, sticking to your code, you could obtain dots.remaining as removed <- na.omit(match(names(cl), params.fun1)) dots.remaining <- dots[seq_along(dots)[-removed]] or by removed <- c("lty",params.fun1) ## I assume you do not want to pass on argument "lty"... dots.remaining <- cl[-1] ### remove the function name dots.remaining <- dots.remaining[! names(dots.remaining) %in% removed] Best, Peter ______________________________________________ R-help@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.