Hi all,
Sorry if this is documented somewhere, but trying to search and google for
ways to alter my "..." argument is having me chasing my tail.
Is there someway that I can manipulate the elements in "..."?
Specifically I'd like to use certain vars in "...", then remove
them
from "..." and pass the rest of "..." to another function.
Here's a short example: I'm adding more functionality to a generic
method by defining how it works on a new class "MyClass":
setMethod('existingFunction', 'MyClass', function (object, ...)
{
vars <- list(...)
doSomethingWith(vars$myCustomVar)
# now I want to pass the rest of the vars down to another function,
# let's say some plotting function, so I'd like to remove
# `myCustomVar` from "...", keep the rest of the vars and just
# pass the valid "..." elements down through the call chain
doSomePlot(somethingSane, ...)
})
Currently the `doSomePlot` that's called does fine until it passes the
rest of it's vars to the "real" plot method, at which point
I'll get
a warning like:
Warning messages:
1: In plot.window(...) : "myCustomVar" is not a graphical parameter
2: In plot.xy(xy, type, ...) : "myCustomVar" is not a graphical
parameter
3: In axis(side = side, at = at, labels = labels, ...) :
"myCustomVar" is not a graphical parameter
4: In axis(side = side, at = at, labels = labels, ...) :
"myCustomVar" is not a graphical parameter
5: In box(...) : "myCustomVar" is not a graphical parameter
6: In title(...) : "myCustomVar" is not a graphical parameter
Depending on what the name of myCustomVar is, this can work even with
the warnings, which is passable. It might also bail if myCustomVar
happens to share a name with a real plotting var, but has an illegal
value for it.
Anyway, while there are ways it can work in this case, I'm just wondering
if I can remove elements from "..." and side-step these warning/error
issues
altogether.
Since "vars <- list(...)" works to create a list of arguments from
"...",
I'm guessing there must be a way to take an already existing list variable
and turn its name/value pairs into an appropriate "..." object?
Thanks for any help,
-steve
On 2/12/2009 2:34 PM, Steve Lianoglou wrote:> Hi all, > > Sorry if this is documented somewhere, but trying to search and google for > ways to alter my "..." argument is having me chasing my tail. > > Is there someway that I can manipulate the elements in "..."? > Specifically I'd like to use certain vars in "...", then remove them > from "..." and pass the rest of "..." to another function. > > Here's a short example: I'm adding more functionality to a generic > method by defining how it works on a new class "MyClass": > > setMethod('existingFunction', 'MyClass', function (object, ...) { > vars <- list(...) > doSomethingWith(vars$myCustomVar) > > # now I want to pass the rest of the vars down to another function, > # let's say some plotting function, so I'd like to remove > # `myCustomVar` from "...", keep the rest of the vars and just > # pass the valid "..." elements down through the call chain > > doSomePlot(somethingSane, ...) > }) > > Currently the `doSomePlot` that's called does fine until it passes the > rest of it's vars to the "real" plot method, at which point I'll get > a warning like: > > Warning messages: > 1: In plot.window(...) : "myCustomVar" is not a graphical parameter > 2: In plot.xy(xy, type, ...) : "myCustomVar" is not a graphical parameter > 3: In axis(side = side, at = at, labels = labels, ...) : > "myCustomVar" is not a graphical parameter > 4: In axis(side = side, at = at, labels = labels, ...) : > "myCustomVar" is not a graphical parameter > 5: In box(...) : "myCustomVar" is not a graphical parameter > 6: In title(...) : "myCustomVar" is not a graphical parameter > > Depending on what the name of myCustomVar is, this can work even with > the warnings, which is passable. It might also bail if myCustomVar > happens to share a name with a real plotting var, but has an illegal > value for it. > > Anyway, while there are ways it can work in this case, I'm just wondering > if I can remove elements from "..." and side-step these warning/error issues > altogether. > > Since "vars <- list(...)" works to create a list of arguments from "...", > I'm guessing there must be a way to take an already existing list variable > and turn its name/value pairs into an appropriate "..." object?I don't think so, but an alternative is to put together a parameter list and call do.call(). For example, > g <- function(...) { + list(...) # just return the arg list to see what arrived + } > > f <- function(...) { + all <- list(...) + all["nothanks"] <- NULL + do.call("g", all) + } > > g(nothanks=1, yesplease=2) $nothanks [1] 1 $yesplease [1] 2 > f(nothanks=1, yesplease=2) $yesplease [1] 2 Duncan Murdoch
here's an example which may give you a hint -- it is not supposed to
solve your particular problem:
f = function(...)
list(...)
g = function(...) {
args = list(...)
names = names(args)
if (is.null(names))
f(...)
else
do.call(f, args[names(args) != 'foo']) }
g()
# list()
g(1)
# list(1)
g(a=1)
# list(a=1)
g(a=1, foo=2)
# list(a=1)
g(1, foo=2)
# list(1)
g(foo=1)
# list()
consider using grep for finding the variables to be removed.
vQ
Steve Lianoglou wrote:> Hi all,
>
> Sorry if this is documented somewhere, but trying to search and google for
> ways to alter my "..." argument is having me chasing my tail.
>
> Is there someway that I can manipulate the elements in "..."?
> Specifically I'd like to use certain vars in "...", then
remove them
> from "..." and pass the rest of "..." to another
function.
>
> Here's a short example: I'm adding more functionality to a generic
> method by defining how it works on a new class "MyClass":
>
> setMethod('existingFunction', 'MyClass', function (object,
...) {
> vars <- list(...)
> doSomethingWith(vars$myCustomVar)
>
> # now I want to pass the rest of the vars down to another function,
> # let's say some plotting function, so I'd like to remove
> # `myCustomVar` from "...", keep the rest of the vars and just
> # pass the valid "..." elements down through the call chain
>
> doSomePlot(somethingSane, ...)
> })
>
> Currently the `doSomePlot` that's called does fine until it passes the
> rest of it's vars to the "real" plot method, at which point
I'll get
> a warning like:
>
> Warning messages:
> 1: In plot.window(...) : "myCustomVar" is not a graphical
parameter
> 2: In plot.xy(xy, type, ...) : "myCustomVar" is not a graphical
parameter
> 3: In axis(side = side, at = at, labels = labels, ...) :
> "myCustomVar" is not a graphical parameter
> 4: In axis(side = side, at = at, labels = labels, ...) :
> "myCustomVar" is not a graphical parameter
> 5: In box(...) : "myCustomVar" is not a graphical parameter
> 6: In title(...) : "myCustomVar" is not a graphical parameter
>
> Depending on what the name of myCustomVar is, this can work even with
> the warnings, which is passable. It might also bail if myCustomVar
> happens to share a name with a real plotting var, but has an illegal
> value for it.
>
> Anyway, while there are ways it can work in this case, I'm just
wondering
> if I can remove elements from "..." and side-step these
warning/error issues
> altogether.
>
> Since "vars <- list(...)" works to create a list of arguments
from "...",
> I'm guessing there must be a way to take an already existing list
variable
> and turn its name/value pairs into an appropriate "..." object?
>
> Thanks for any help,
> -steve
>
> ______________________________________________
> 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