Re: [R] Overriding predict based on newdata...

2014-03-18 Thread Jonathan Greenberg
David:

Thanks!  Is it generally frowned upon (if I'm Incorporating this into
a package) to override a generic function like predict, even if I
plan on making it a pass-through function (same parameters, and if the
data type doesn't match my weird data type, it will simply pass the
parameters through to the generic S3 predict)?

--j

On Mon, Mar 17, 2014 at 4:08 AM, David Winsemius dwinsem...@comcast.net wrote:
 S3 classes only dispatch on the basis of the first parameter class. That was 
 one of the reasons for the development of S4-classed objects. You say you 
 have the expectation that the object is of a class that has an ordinary 
 `predict` method presumably S3 in character,  so you probably need to write a 
 function that will mask the existing method. You would rewrite the existing 
 test for the existence of 'newdata' and the the definition of the new 
 function would persist through the rest of the session and could be 
 source()-ed in further sessions.

 --
 David.


 On Mar 16, 2014, at 2:09 PM, Jonathan Greenberg wrote:

 R-helpers:

 I'm having some trouble with this one -- I figure because I'm a bit of
 a noob with S3 classes...  Here's my challenge: I want to write a
 custom predict statement that is triggered based on the presence and
 class of a *newdata* parameter (not the object parameter).  The
 reason is I am trying to write a custom function based on an oddly
 formatted dataset that has been assigned an R class.  If the predict
 function detects it (class(newdata) == myweirdformat) it does a
 conversion of the newdata to what most predict statements expect (e.g.
 a dataframe) and then passes the converted dataset along to the
 generic predict statement.  If newdata is missing or is not of the odd
 class it should just pass everything along to the generic predict as
 usual.

 What would be the best way to approach this problem?  Since (my
 understanding) is that predict is dispatched based on the object
 parameter, this is causing me confusion -- my object should still
 remain the model, I'm just allowing a new data type to be fed into the
 predict model(s).

 Cheers!

 --j

 --
 Jonathan A. Greenberg, PhD
 Assistant Professor
 Global Environmental Analysis and Remote Sensing (GEARS) Laboratory
 Department of Geography and Geographic Information Science
 University of Illinois at Urbana-Champaign
 259 Computing Applications Building, MC-150
 605 East Springfield Avenue
 Champaign, IL  61820-6371
 Phone: 217-300-1924
 http://www.geog.illinois.edu/~jgrn/
 AIM: jgrn307, MSN: jgrn...@hotmail.com, Gchat: jgrn307, Skype: jgrn3007

 __
 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.

 David Winsemius
 Alameda, CA, USA




-- 
Jonathan A. Greenberg, PhD
Assistant Professor
Global Environmental Analysis and Remote Sensing (GEARS) Laboratory
Department of Geography and Geographic Information Science
University of Illinois at Urbana-Champaign
259 Computing Applications Building, MC-150
605 East Springfield Avenue
Champaign, IL  61820-6371
Phone: 217-300-1924
http://www.geog.illinois.edu/~jgrn/
AIM: jgrn307, MSN: jgrn...@hotmail.com, Gchat: jgrn307, Skype: jgrn3007

__
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] Overriding predict based on newdata...

2014-03-18 Thread Thomas Lumley
On Mon, Mar 17, 2014 at 4:08 AM, David Winsemius dwinsem...@comcast.netwrote:

 S3 classes only dispatch on the basis of the first parameter class.


A minor distinction: S3 classes only dispatch on the basis on *one* of the
parameters. The person who writes the generic gets to choose, and for
predict() it is the first parameter, but it doesn't have to be for other
generics.

In model-fitting functions you often have formula= as the first argument
and data= as the second, and it makes much more sense to dispatch on data=
than on formula=.

The first well-known example is probably MASS::loglm, used in S
Programming to illustrate this issue but most of the methods in my survey
package also dispatch based on the second argument.




 That was one of the reasons for the development of S4-classed objects. You
 say you have the expectation that the object is of a class that has an
 ordinary `predict` method presumably S3 in character,  so you probably need
 to write a function that will mask the existing method.



Or write an S4 method for predict and use setGeneric(). That's also not
perfect: if everyone did it there would be lots of competing S4 generics
with the same name, and too many people would have to understand how they
are scoped.



   -thomas


-- 
Thomas Lumley
Professor of Biostatistics
University of Auckland

[[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] Overriding predict based on newdata...

2014-03-18 Thread Bert Gunter
Jonathan:

As David said, this is a key aspect  of S4 (there are others, of
course). But it can be simulated in S3, I think, albeit inelegantly.
You merely have to extend the class of object, the fitted object you
dispatch on, and then write an appropriate method for this extended
class. e.g.

## wholly untested!

class(obj)- c(mySpecial,class(obj)) ## extend class of fitted object
predict.mySpecial- function(object,newdata,...){
  if(inherits(newdata,weirdClasss)){
... ## do something
  }
  else NextMethod() ## pass through to standard predict method
}

## Now this will work as desired:
predict(obj)

If this is obviously stupid -- or even not so obviously -- I would
appreciate someone pointing it out.

Best,
Bert

Bert Gunter
Genentech Nonclinical Biostatistics
(650) 467-7374

Data is not information. Information is not knowledge. And knowledge
is certainly not wisdom.
H. Gilbert Welch




On Tue, Mar 18, 2014 at 7:28 AM, Jonathan Greenberg j...@illinois.edu wrote:
 David:

 Thanks!  Is it generally frowned upon (if I'm Incorporating this into
 a package) to override a generic function like predict, even if I
 plan on making it a pass-through function (same parameters, and if the
 data type doesn't match my weird data type, it will simply pass the
 parameters through to the generic S3 predict)?

 --j

 On Mon, Mar 17, 2014 at 4:08 AM, David Winsemius dwinsem...@comcast.net 
 wrote:
 S3 classes only dispatch on the basis of the first parameter class. That was 
 one of the reasons for the development of S4-classed objects. You say you 
 have the expectation that the object is of a class that has an ordinary 
 `predict` method presumably S3 in character,  so you probably need to write 
 a function that will mask the existing method. You would rewrite the 
 existing test for the existence of 'newdata' and the the definition of the 
 new function would persist through the rest of the session and could be 
 source()-ed in further sessions.

 --
 David.


 On Mar 16, 2014, at 2:09 PM, Jonathan Greenberg wrote:

 R-helpers:

 I'm having some trouble with this one -- I figure because I'm a bit of
 a noob with S3 classes...  Here's my challenge: I want to write a
 custom predict statement that is triggered based on the presence and
 class of a *newdata* parameter (not the object parameter).  The
 reason is I am trying to write a custom function based on an oddly
 formatted dataset that has been assigned an R class.  If the predict
 function detects it (class(newdata) == myweirdformat) it does a
 conversion of the newdata to what most predict statements expect (e.g.
 a dataframe) and then passes the converted dataset along to the
 generic predict statement.  If newdata is missing or is not of the odd
 class it should just pass everything along to the generic predict as
 usual.

 What would be the best way to approach this problem?  Since (my
 understanding) is that predict is dispatched based on the object
 parameter, this is causing me confusion -- my object should still
 remain the model, I'm just allowing a new data type to be fed into the
 predict model(s).

 Cheers!

 --j

 --
 Jonathan A. Greenberg, PhD
 Assistant Professor
 Global Environmental Analysis and Remote Sensing (GEARS) Laboratory
 Department of Geography and Geographic Information Science
 University of Illinois at Urbana-Champaign
 259 Computing Applications Building, MC-150
 605 East Springfield Avenue
 Champaign, IL  61820-6371
 Phone: 217-300-1924
 http://www.geog.illinois.edu/~jgrn/
 AIM: jgrn307, MSN: jgrn...@hotmail.com, Gchat: jgrn307, Skype: jgrn3007

 __
 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.

 David Winsemius
 Alameda, CA, USA




 --
 Jonathan A. Greenberg, PhD
 Assistant Professor
 Global Environmental Analysis and Remote Sensing (GEARS) Laboratory
 Department of Geography and Geographic Information Science
 University of Illinois at Urbana-Champaign
 259 Computing Applications Building, MC-150
 605 East Springfield Avenue
 Champaign, IL  61820-6371
 Phone: 217-300-1924
 http://www.geog.illinois.edu/~jgrn/
 AIM: jgrn307, MSN: jgrn...@hotmail.com, Gchat: jgrn307, Skype: jgrn3007

 __
 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.

__
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] Overriding predict based on newdata...

2014-03-17 Thread David Winsemius
S3 classes only dispatch on the basis of the first parameter class. That was 
one of the reasons for the development of S4-classed objects. You say you have 
the expectation that the object is of a class that has an ordinary `predict` 
method presumably S3 in character,  so you probably need to write a function 
that will mask the existing method. You would rewrite the existing test for the 
existence of 'newdata' and the the definition of the new function would persist 
through the rest of the session and could be source()-ed in further sessions.

-- 
David.


On Mar 16, 2014, at 2:09 PM, Jonathan Greenberg wrote:

 R-helpers:
 
 I'm having some trouble with this one -- I figure because I'm a bit of
 a noob with S3 classes...  Here's my challenge: I want to write a
 custom predict statement that is triggered based on the presence and
 class of a *newdata* parameter (not the object parameter).  The
 reason is I am trying to write a custom function based on an oddly
 formatted dataset that has been assigned an R class.  If the predict
 function detects it (class(newdata) == myweirdformat) it does a
 conversion of the newdata to what most predict statements expect (e.g.
 a dataframe) and then passes the converted dataset along to the
 generic predict statement.  If newdata is missing or is not of the odd
 class it should just pass everything along to the generic predict as
 usual.
 
 What would be the best way to approach this problem?  Since (my
 understanding) is that predict is dispatched based on the object
 parameter, this is causing me confusion -- my object should still
 remain the model, I'm just allowing a new data type to be fed into the
 predict model(s).
 
 Cheers!
 
 --j
 
 -- 
 Jonathan A. Greenberg, PhD
 Assistant Professor
 Global Environmental Analysis and Remote Sensing (GEARS) Laboratory
 Department of Geography and Geographic Information Science
 University of Illinois at Urbana-Champaign
 259 Computing Applications Building, MC-150
 605 East Springfield Avenue
 Champaign, IL  61820-6371
 Phone: 217-300-1924
 http://www.geog.illinois.edu/~jgrn/
 AIM: jgrn307, MSN: jgrn...@hotmail.com, Gchat: jgrn307, Skype: jgrn3007
 
 __
 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.

David Winsemius
Alameda, CA, USA

__
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.


[R] Overriding predict based on newdata...

2014-03-16 Thread Jonathan Greenberg
R-helpers:

I'm having some trouble with this one -- I figure because I'm a bit of
a noob with S3 classes...  Here's my challenge: I want to write a
custom predict statement that is triggered based on the presence and
class of a *newdata* parameter (not the object parameter).  The
reason is I am trying to write a custom function based on an oddly
formatted dataset that has been assigned an R class.  If the predict
function detects it (class(newdata) == myweirdformat) it does a
conversion of the newdata to what most predict statements expect (e.g.
a dataframe) and then passes the converted dataset along to the
generic predict statement.  If newdata is missing or is not of the odd
class it should just pass everything along to the generic predict as
usual.

What would be the best way to approach this problem?  Since (my
understanding) is that predict is dispatched based on the object
parameter, this is causing me confusion -- my object should still
remain the model, I'm just allowing a new data type to be fed into the
predict model(s).

Cheers!

--j

-- 
Jonathan A. Greenberg, PhD
Assistant Professor
Global Environmental Analysis and Remote Sensing (GEARS) Laboratory
Department of Geography and Geographic Information Science
University of Illinois at Urbana-Champaign
259 Computing Applications Building, MC-150
605 East Springfield Avenue
Champaign, IL  61820-6371
Phone: 217-300-1924
http://www.geog.illinois.edu/~jgrn/
AIM: jgrn307, MSN: jgrn...@hotmail.com, Gchat: jgrn307, Skype: jgrn3007

__
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.