Skip to content

Test for argument in ...

6 messages · Gabor Grothendieck, Gregor Gorjanc

#
Hello!

Say I have a function foo1, which has argument ... to pass various
arguments to foo2 i.e.

foo1 <- function(x, ...)
{
  foo2(x, ...)
}

Say that foo2 accepts argument arg1 and I would like to do the following:
- if foo1 is called as foo1(x) then I would like to assign some value to
arg1 inside foo1 before calling foo2

arg1 <- "some value"
foo2(x, arg1=arg1)

- if foo1 is called foo1(arg1="some other value") do not assign some
value to arg1 and call foo2

foo2(arg1=arg1)

However, I am not able to do this since I do not know how to test/check
if arg1 was given in foo1. Is it possible to test whether some argument
was passed in "..." i.e. something like

foo1 <- function(x, ...)
{
  if(testForArgumentInThreeDots(arg1)) arg1 <- "some value"
  foo2(x, arg1=arg1, ...)
}

Thanks!
#
Try this:
arg1 found
arg1 not found
On 7/1/06, Gregor Gorjanc <gregor.gorjanc at gmail.com> wrote:
#
Gabor Grothendieck wrote:
Thanks!

Use of list(...) really helps me here.

  
    
#
Hi,
Gabor Grothendieck wrote:
Actually it is not OK. Bellow is simplified example that shows, what I
would like to do:

foo1 <- function(x, ...)
{
  if(is.null(list(...)$decreasing)) {
    decreasing <- TRUE
  } else {
    decreasing <- list(...)$decreasing
  }
  return(order(x, ..., decreasing=decreasing))
}
[1] 1 4 3 2
Error in order(x, ..., decreasing = decreasing) :
        formal argument "decreasing" matched by multiple actual arguments

  
    
#
That's because you are passing the argument twice.  Try this:
+ {
+  L <- list(...)
+  if (is.null(L$decreasing)) L$decreasing <- TRUE
+  do.call(order, c(list(x), L))
+ }
[1] 2 3 4 1
On 7/1/06, Gregor Gorjanc <gregor.gorjanc at gmail.com> wrote:
#
Yes, this works.

Thanks Gabor!
Gabor Grothendieck wrote: