Re: [R] How to pass selection criteria in a function

2010-12-01 Thread Charles C. Berry

On Wed, 1 Dec 2010, cmccar...@bmcc.cuny.edu wrote:


Hi,
Suppose I have the following data

name score
Abel??? 88
Baker? 54
Charlie??? 77

stored a? table called myData.


I want to write a function that will create a table which is a subset of myData 
containing those have a score  75.

I know I can do this with the following command:
subset(myData, score  75)

But I would like to do this via a function, something like:

newTable - function( data,? criteria){
??? subset( data, criteria) }

and then calling: newTable(myData, score  75)

But this doesn't work. I am sure there is a simple way to do this,
but I am stuck! Please help. Thanks!


Simple? Maybe not so much!

You are trying to pass objects without evaluating them. subset is rather 
special in the way it works. Here is one way:



foo - function(x,...){

+ mc - match.call()
+ mc[[1]] - as.name(subset)
+ eval(mc)
+ }

foo(iris, Petal.Width2.4 )

Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
101  6.3 3.3  6.0 2.5 virginica
110  7.2 3.6  6.1 2.5 virginica
145  6.7 3.3  5.7 2.5 virginica


Reading the code at the top of lm shows how this kind of strategy can be 
used.


You might look at

?bquote

for another way to skin this cat.


HTH,

Chuck




Chris?McCarthy, PhD
Department?of?Mathematics?BMCC
Office:?N522???Extension:?5235
cmccar...@bmcc.cuny.edu
[[alternative HTML version deleted]]




Charles C. BerryDept of Family/Preventive Medicine
cbe...@tajo.ucsd.eduUC San Diego
http://famprevmed.ucsd.edu/faculty/cberry/  La Jolla, San Diego 92093-0901

__
R-help@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.


Re: [R] How to pass selection criteria in a function

2010-12-01 Thread Henrique Dallazuanna
Try this:

newTable - function(data, criteria) {
do.call(subset, list(data, substitute(criteria)))
}

On Wed, Dec 1, 2010 at 3:56 PM, cmccar...@bmcc.cuny.edu wrote:

 Hi,
 Suppose I have the following data

 name score
 Abel88
 Baker  54
 Charlie77

 stored a  table called myData.


 I want to write a function that will create a table which is a subset of
 myData containing those have a score  75.

 I know I can do this with the following command:
 subset(myData, score  75)

 But I would like to do this via a function, something like:

 newTable - function( data,  criteria){
 subset( data, criteria) }

 and then calling: newTable(myData, score  75)

 But this doesn't work. I am sure there is a simple way to do this,
 but I am stuck! Please help. Thanks!


 Chris McCarthy, PhD
 Department of Mathematics BMCC
 Office: N522   Extension: 5235
 cmccar...@bmcc.cuny.edu
[[alternative HTML version deleted]]


 __
 R-help@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.




-- 
Henrique Dallazuanna
Curitiba-Paraná-Brasil
25° 25' 40 S 49° 16' 22 O

[[alternative HTML version deleted]]

__
R-help@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.


Re: [R] How to pass selection criteria in a function

2010-12-01 Thread ChrisMath

Thank you all for your very fast replies.

I tried Henrique's method (see one of the above posts) , and it works
perfectly!
Thanks again!
-- 
View this message in context: 
http://r.789695.n4.nabble.com/How-to-pass-selection-criteria-in-a-function-tp3067765p3067829.html
Sent from the R help mailing list archive at Nabble.com.

__
R-help@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.


Re: [R] How to pass selection criteria in a function

2010-12-01 Thread David Winsemius


On Dec 1, 2010, at 1:12 PM, Charles C. Berry wrote:


On Wed, 1 Dec 2010, cmccar...@bmcc.cuny.edu wrote:


Hi,
Suppose I have the following data

name score
Abel88
Baker  54
Charlie77

stored a  table called myData.


I want to write a function that will create a table which is a  
subset of myData containing those have a score  75.


I know I can do this with the following command:
subset(myData, score  75)

But I would like to do this via a function, something like:

newTable - function( data,  criteria){
subset( data, criteria) }

and then calling: newTable(myData, score  75)

But this doesn't work. I am sure there is a simple way to do this,
but I am stuck! Please help. Thanks!


Simple? Maybe not so much!

You are trying to pass objects without evaluating them. subset is  
rather special in the way it works. Here is one way:



foo - function(x,...){

+ mc - match.call()
+ mc[[1]] - as.name(subset)
+ eval(mc)
+ }

foo(iris, Petal.Width2.4 )

   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
101  6.3 3.3  6.0 2.5 virginica
110  7.2 3.6  6.1 2.5 virginica
145  6.7 3.3  5.7 2.5 virginica


I've never really understood how to use browser() to develop or  
resolve problems with function definitions. Chuck's comments pointing  
to the subset function offered another opportunity to teach myself  
something new. Here's the console transcript:


 newTable - function( data, criteria){  crit -  
substitute(criteria);browser()}

# Obviously not a complete function
 newT - newTable(myData, score  75)
Called from: newTable(myData, score  75) #so far so good
Browse[1] criteria  # I realize now that this should  
have been crit
Error: object 'score' not found  # took another look at subset()  
code
Browse[1] newTable - function( data, criteria){  crit -  
substitute(criteria); logvec - eval(crit, data, parent.frame());  
browser()}
Browse[1] criteria  # still didn't catch on that crit  
was the local object to examine

Error: object 'score' not found  # just slow I guess.
In addition: Warning message:
restarting interrupted promise evaluation
Browse[1] c  # was worried the the redefinition might not take  
effect at the top-level


# Try # 2
 newTable - function( data, criteria){  crit -  
substitute(criteria); logvec - eval(crit, data, parent.frame());  
browser()}

 newT - newTable(myData, score  75)
Called from: newTable(myData, score  75)
Browse[1] logvec
[1] FALSE  TRUE FALSE# now we're getting results
Browse[1] return(data[logvec, ])# see if the naive next step works
 newT
   name score
2 Baker54# very promising
 newTable - function( data, criteria){  crit -  
substitute(criteria); logvec - eval(crit, data, parent.frame());  
return(data[logvec, ])}

 newT - newTable(myData, score  75)
 newT# SUCCESS
   name score
2 Baker54

There is not much in the way of error checking, but it seems to be a  
reasonable start (and looks to offer an example, albeit with a some  
newbie errors, of an extremely useful R tool.)




Reading the code at the top of lm shows how this kind of strategy  
can be used.




Charles C. BerryDept of Family/ 
Preventive Medicine


Thanks, Chuck.

--

David Winsemius, MD
West Hartford, CT

__
R-help@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.