Skip to content

passing arguments to subset from a function

5 messages · GOUACHE David, David Winsemius, Baptiste Auguie +2 more

#
Hello R-helpers,
 
I'm writing a long function in which I manipulate a certain number of datasets. I want the arguments of said function to allow me to adapt the way I do this. Among other things, I want my function to have an argument which I will pass on to subset() somewhere inside my function. Here is a quick and simplified example with the iris dataset.
 
myfunction<-function(table, extraction)  {
     table2<-subset(table, extraction)
return(table2) }
 
myfunction(iris, extraction= Species=="setosa")
 
 
############## end
 
What I would like is for this function to return exactly the same thing as : 
subset(iris, Species=="setosa")
 
 
Thanks for your help.
 
Regards,
 
David Gouache
#
Available free for the typing are the functions for the default and  
the dataframe methods of subset:

 >  subset.default
function (x, subset, ...)
{
     if (!is.logical(subset))
         stop("'subset' must be logical")
     x[subset & !is.na(subset)]
}


 > subset.data.frame
function (x, subset, select, drop = FALSE, ...)
{
     if (missing(subset))
         r <- TRUE
     else {
         e <- substitute(subset)
         r <- eval(e, x, parent.frame())
         if (!is.logical(r))
             stop("'subset' must evaluate to logical")
         r <- r & !is.na(r)
     }
     if (missing(select))
         vars <- TRUE
     else {
         nl <- as.list(1:ncol(x))
         names(nl) <- names(x)
         vars <- eval(substitute(select), nl, parent.frame())
     }
     x[r, vars, drop = drop]
}

(There is also a matrix method.)
#
I wrote a dirty hack last time I faced this problem, I'll be curious  
to see what is the proper way of dealing with the scoping and  
evaluation rules.

library(datasets)

myfunction<-function(table, extraction)  {
     table2<-subset(table,extraction)
return(table2)
}


condition1 <- quote(iris$Species=="setosa") # I'm not sure how to  
evaluate within the environment, perhaps you could use with(table,  
subset(table, extraction) ) in your function
condition2 <- bquote(.(condition1)  & iris$Sepal.Width < 3.5) # say,  
if you want to concatenate several conditions together

myfunction(iris, extraction= eval(condition1))
myfunction(iris, extraction= eval(condition2))


Best wishes,

baptiste
On 17 Dec 2008, at 19:07, GOUACHE David wrote:

            
_____________________________

Baptiste Augui?

School of Physics
University of Exeter
Stocker Road,
Exeter, Devon,
EX4 4QL, UK

Phone: +44 1392 264187

http://newton.ex.ac.uk/research/emag
#
This thread may help?

https://stat.ethz.ch/pipermail/r-help/2007-November/145345.html

On Wed, 17 Dec 2008 20:07:08 +0100, "GOUACHE David"
<D.GOUACHE at arvalisinstitutduvegetal.fr> wrote:
as
#
On Wed, 17 Dec 2008 20:07:08 +0100, GOUACHE David <D.GOUACHE at arvalisinstitutduvegetal.fr> wrote:
I would use the example of .() function from plyr package in this case:

.<-function (...){
     structure(as.list(match.call()[-1]), class = "quoted")
}

myfunction<-function(table, extraction)  {
     table2<-subset(table, eval(extraction[[1]]))
     return(table2)
 }
myfunction(iris, extraction = .(Species=="setosa"))

You can pass as many arguments in .() as you wish and index correspondingly in myfunction afterwards.

HTH.