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

Duncan Murdoch murdoch at stats.uwo.ca
Thu Jun 14 15:58:25 CEST 2007


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



More information about the R-help mailing list