[R] Argument validation within functions

Enrico Schumann enricoschumann at yahoo.de
Tue Dec 6 16:39:44 CET 2011


you may be looking for ?missing

f <- function(a,b) {
     if (missing(b)) print("b is missing")
}

f(a=1, b=2)
f(a=1)
f(b=2)

Regards,
Enrico

Am 06.12.2011 16:15, schrieb Johannes Radinger:
> Thank you, i didn't know that the !operator is
> also working for is.numeric etc.
>
> 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.

-- 
Enrico Schumann
Lucerne, Switzerland
http://nmof.net/



More information about the R-help mailing list