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