[R] How can I overwrite a method in R?

Duncan Murdoch murdoch.duncan at gmail.com
Thu Oct 9 10:55:37 CEST 2014


On 09/10/2014, 2:14 AM, Tim Hesterberg wrote:
> How can I create an improved version of a method in R, and have it be used?
> 
> Short version:
> I think plot.histogram has a bug, and I'd like to try a version with a fix.
> But when I call hist(), my fixed version doesn't get used.

To be clear, we're talking S3 methods here.  Your long version below
documents the issue pretty well.  There isn't a simple way to do what
you want, but there are a couple of not-really-simple ways.

The best is to submit a bug report with a patch for the method that
doesn't work, and eventually the base version will probably get fixed.
But maybe not the way you fixed it, and we might not agree that it's a
bug.  So this is a little slow and no use while you are testing your patch.

You can install R from source, and develop your patch that way.  This is
best if you are thinking of submitting the bug report.

If you want local changes that might not make it into the base code,
then I think the best thing to do is to change the class, and write a
method for a new class.  hist() produces objects of class "histogram";
you can modify a local copy to produce objects of class
c("newhistogram", "histogram").  Then plot() on one of those will call
plot.newhistogram in preference to plot.histogram.

An alternative approach that is less work in the short term, but more
error prone in the long term is to make a habit of calling hist() with
plot=FALSE, then call plot.histogram() on the result explicitly.  If you
have a local version of plot.histogram() this should use yours.

One more inline comment below.

> 
> Long version:
> hist() calls plot() which calls plot.histogram() which fails to pass ...
> when it calls plot.window().
> As a result hist() ignores xaxs and yaxs arguments.
> I'd like to make my own copy of plot.histogram that passes ... to
> plot.window().
> 
> If I just make my own copy of plot.histogram, plot() ignores it, because my
> version is not part of the same graphics package that plot belongs to.
> 
> If I copy hist, hist.default and plot, the copies inherit the same
> environments as
> the originals, and behave the same.
> 
> If I also change the environment of each to .GlobalEnv, hist.default fails
> in
> a .Call because it cannot find C_BinCount.

You could fix this by prefixing C_BinCount as graphics:::C_BinCount, but
that's internal code that might change in future releases.

Duncan Murdoch

> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at 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.
>



More information about the R-help mailing list