Re: [R] Using subset() in a user-defined function

From: Duncan Murdoch <murdoch_at_stats.uwo.ca>
Date: Thu, 14 Jun 2007 11:18:23 -0400

On 6/14/2007 10:57 AM, Tobin, Jared wrote:
> Thanks for the quick response, Duncan.
>
> The given code doesn't seem to work, and possibly due to this reason I
> found in the online help for missing() (if I understand it correctly):
>
> "Currently missing() can only be used in the immediate body of the
> function that defines the argument, not in the body of a nested function
> or a local call. This may change in the future."
>
> So as I understand it, missing() cannot refer to the arguments of
> function1 if it is used in an argument of subset()? It seems to remain
> a promising function for this situation regardless, but I'm not sure how
> I could implement it into the subset() arguments offhand.

Right, I had forgotten that subset uses nonstandard evaluation. You could evaluate add some variables to hold it, e.g.

mysubset <- function(arg1="", arg2="", arg3="") {
   miss1 <- missing(arg1)
   miss2 <- missing(arg2)
   miss3 <- missing(arg3)

   subset(master.frame, (miss1 | a == arg1) &
                      (miss2 | b == arg2) &
                      (miss3 | c == arg3))
}

This time I did test it as I should have last time, so I can tell you that if all args are missing you'll get the full master.frame.

Duncan Murdoch
>
> --
>
> jared tobin, student research assistant
> dept. of fisheries and oceans
> tobinjr_at_dfo-mpo.gc.ca
>
> -----Original Message-----
> From: Duncan Murdoch [mailto:murdoch@stats.uwo.ca]
> Sent: Thursday, June 14, 2007 11:28 AM
> To: Tobin, Jared
> Cc: r-help_at_stat.math.ethz.ch
> Subject: Re: [R] Using subset() in a user-defined function
>
> On 6/14/2007 9:38 AM, Tobin, Jared wrote:

>> Hello,
>> 
>> I'm having a problem with using subset() inside a function I'm

> writing.
>> Ignoring everything else in the function, the problem can be 
>> illustrated by (where master.frame is the data frame I'm using):
>> 
>> 
>> function1 <- function(arg1="", arg2="", arg3=""){
>> 
>> 	temp.frame <- subset(master.frame, a == arg1 & b == arg2 & c ==
>> arg3)
>> 
>> }
>> 
>> 
>> This works fine if the user specifies all arguments, but if any one or

>
>> more of the arguments isn't specified, say arg1 for example, the 
>> subset is empty because subset() goes looking for values of a == "" in

>
>> master.frame, and there are none.  I want it to work such that if an 
>> argument is not specified, it is not included in what subset() goes 
>> looking for.  So if I were to input:
>> 
>> function1(arg2=5, arg3=6)
>> 
>> then in function1, the subset command will look like
>> 
>> 	temp.frame <- subset(master.frame, b == 5 & c == 6)
>> 
>> 
>> Any suggestions would be much appreciated.

>
> Code it like this:
>
> subset(master.frame, (missing(arg1) | a == arg1) &
> (missing(arg2) | b == arg2) &
> (missing(arg3) | c == arg3))
>
> I haven't tried this, and I forget what happens in subset() if you pass
> it a subset of the wrong length, so it might fail if all args are
> missing, but otherwise I think it should work. It does depend on
> defaults for the args existing and not causing errors in the equality
> tests (it's not using shortcut evaluation).
>
> Duncan Murdoch
>
> ______________________________________________
> R-help_at_stat.math.ethz.ch 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.


R-help_at_stat.math.ethz.ch 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. Received on Thu 14 Jun 2007 - 16:05:28 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Thu 14 Jun 2007 - 17:31:59 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.