[R] Argument validation within functions

Bert Gunter gunter.berton at gene.com
Tue Dec 6 17:05:37 CET 2011


On Tue, Dec 6, 2011 at 7:15 AM, Johannes Radinger <JRadinger at gmx.at> wrote:
> Thank you, i didn't know that the !operator is
> also working for is.numeric etc.

Read (more carefully?) R docs, please. ! is a unary function that
takes a logical argument(and will coerce to logical nonlogical
arguments if it can); is.numeric() returns a logical, so of course it
should "work". Ergo your failure to understand indicates a fundamental
hole in your understanding of how R works.

-- Bert

>
> Anyway I want to test if an argument is set in the
> function call and if not a code is executed... So
> far I tried:
>
> f <-function(a,b){
>        if(!exists("b")) print("exists: b is not set")
>        if(is.null("b")) print("is.null : b is not set")
> }
>
> f(a=1,b=2)
> f(a=1)
> f(b=2)
>
> I don't really know how to do it...e.g: for f(a=1) b is not set
> so it also can't be NULL (thats why is.null is not working). I
> just want to "test" if it is set with the function call not outside
> the function or before etc.
>
> /Johannes
>
> -------- Original-Nachricht --------
>> Datum: Tue, 6 Dec 2011 07:57:44 -0500
>> Von: "R. Michael Weylandt" <michael.weylandt at gmail.com>
>> An: r-help <r-help at r-project.org>, Johannes Radinger <JRadinger at gmx.at>
>> Betreff: Re: [R] Argument validation within functions
>
>> Use the ! (not) operator.
>>
>> Not sure what you mean by " as the stop() stops the total function":
>> try the following
>>
>> f <- function(a){
>>    stopifnot(a > 3)
>>    return(a^2)
>> }
>>
>> f(2)
>> f(4)
>>
>> Michael
>>
>> (PS -- It's usually asked to cc the list so that this all gets
>> threaded properly in folks' mailboxes)
>>
>> On Tue, Dec 6, 2011 at 7:46 AM, Johannes Radinger <JRadinger at gmx.at>
>> wrote:
>> > Hi,
>> >
>> > thank you... I think I will go for the if-stop approach
>> > as the stop() stops the total function... So there is just
>> > one little other question: What is the opposite of is.numeric?
>> > Is ther isnot.numeric? How  can that be implemented in following
>> > function:
>> >
>> > f <- function(a){
>> >        if(is.numeric(a)) stop("a is not numeric")
>> >        if(0 > a && a > 1) stop("a must be a value between 0 and 1")
>> >        a
>> > }
>> >
>> > /Johannes
>> >
>> > -------- Original-Nachricht --------
>> >> Datum: Tue, 6 Dec 2011 07:04:59 -0500
>> >> Von: "R. Michael Weylandt" <michael.weylandt at gmail.com>
>> >> An: Johannes Radinger <JRadinger at gmx.at>
>> >> CC: r-help at r-project.org
>> >> Betreff: Re: [R] Argument validation within functions
>> >
>> >> The quick and dirty way to do so is to use: stopifnot() in conjunction
>> >> (if necessary with all() and any()). You can replace that first
>> >> condition with a simple is.numeric() as well. A more helpful way (if
>> >> this is production code) is to use if statement with the stop()
>> >> function directly which lets you provide specific error messages.
>> >>
>> >> Michael
>> >>
>> >> On Tue, Dec 6, 2011 at 6:41 AM, Johannes Radinger <JRadinger at gmx.at>
>> >> wrote:
>> >> > Hi,
>> >> >
>> >> > I just started with writing functions in R and so some questions
>> popped
>> >> up.
>> >> > I provide some values as argument to my function such as:
>> >> >
>> >> > function(a,b,c){}
>> >> >
>> >> > Now i want that the function first checks if the arguments are valid
>> for
>> >> the function. E.g argument "a" has to be a number in the range 0-1. How
>> >> can that easily done?
>> >> >
>> >> > So far I have:
>> >> >
>> >> >        a <- as.numeric(a)
>> >> >        if(0 <= a && a <= 1)
>> >> >
>> >> > to first check if a is a number...if not the function stops and gives
>> an
>> >> error message. If it is a number it just continues...
>> >> >
>> >> > But how to check the range?
>> >> > Above there is the if-approach but then the rest of the function is
>> >> exectued as part of if (or else). Is there a simpler way without having
>> the
>> >> if-brackets around the remaining code?
>> >> > Just a check if the value is between 0 and 1 and if yes continue with
>> >> the next line if no abort the function with a error message? How can
>> such an
>> >> error message be created?
>> >> >
>> >> > thank you and best regards,
>> >> >
>> >> > /Johannes
>> >> > --
>> >> >
>> >> > ______________________________________________
>> >> > 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
>> >> > and provide commented, minimal, self-contained, reproducible code.
>> >
>> > --
>> > NEU: FreePhone - 0ct/min Handyspartarif mit Geld-zurück-Garantie!
>> > Jetzt informieren: http://www.gmx.net/de/go/freephone
>
> --
>
> ______________________________________________
> 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
> and provide commented, minimal, self-contained, reproducible code.



-- 

Bert Gunter
Genentech Nonclinical Biostatistics

Internal Contact Info:
Phone: 467-7374
Website:
http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm



More information about the R-help mailing list