From gregor.gorjanc at gmail.com  Sun Jul  2 12:43:08 2006
From: gregor.gorjanc at gmail.com (Gregor Gorjanc)
Date: Sun, 02 Jul 2006 12:43:08 +0200
Subject: [Rd] Test for argument in ...
In-Reply-To: <971536df0607012019n183955fen188287d184c9d03e@mail.gmail.com>
References: <44A71AB1.4000804@bfro.uni-lj.si>	
	<971536df0607011856m10f64854qd8f42c5de15d7387@mail.gmail.com>	
	<44A73690.5060205@bfro.uni-lj.si>
	<971536df0607012019n183955fen188287d184c9d03e@mail.gmail.com>
Message-ID: <44A7A33C.3010402@bfro.uni-lj.si>

Yes, this works.

Thanks Gabor!

Gabor Grothendieck wrote:
> That's because you are passing the argument twice.  Try this:
> 
>> foo1 <- function(x, ...)
> + {
> +  L <- list(...)
> +  if (is.null(L$decreasing)) L$decreasing <- TRUE
> +  do.call(order, c(list(x), L))
> + }
>>
>> foo1(c(5, 2, 3, 4), decreasing=FALSE)
> [1] 2 3 4 1

> 
> On 7/1/06, Gregor Gorjanc <gregor.gorjanc at gmail.com> wrote:
>> Hi,
>>
>> Gabor Grothendieck wrote:
>> > Try this:
>> >
>> >> f <- function(...) if (!is.null(list(...)$arg1)) cat("arg1 found\n")
>> >> else cat("arg1 not found\n")
>> >> f(arg1 = 3)
>> > arg1 found
>> >> f(arg2 = 3)
>> > arg1 not found
>>
>> 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))
>> }
>>
>> > foo1(c(5, 2, 3, 4))
>> [1] 1 4 3 2
>>
>> >foo1(c(5, 2, 3, 4), decreasing=FALSE)
>> Error in order(x, ..., decreasing = decreasing) :
>>        formal argument "decreasing" matched by multiple actual arguments
>>
>> > On 7/1/06, Gregor Gorjanc <gregor.gorjanc at gmail.com> wrote:
>> >> 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!

-- 
Lep pozdrav / With regards,
    Gregor Gorjanc

----------------------------------------------------------------------
University of Ljubljana     PhD student
Biotechnical Faculty
Zootechnical Department     URI: http://www.bfro.uni-lj.si/MR/ggorjan
Groblje 3                   mail: gregor.gorjanc <at> bfro.uni-lj.si

SI-1230 Domzale             tel: +386 (0)1 72 17 861
Slovenia, Europe            fax: +386 (0)1 72 17 888

----------------------------------------------------------------------
"One must learn by doing the thing; for though you think you know it,
 you have no certainty until you try." Sophocles ~ 450 B.C.



[Rd] Test for argument in ...
Gregor Gorjanc