[R] Debugging R's code: boxplot.stats
Duncan Murdoch
murdoch at stats.uwo.ca
Mon Oct 30 00:47:36 CET 2006
On 10/29/2006 6:08 PM, Matthew Walker wrote:
> On Sat, 2006-10-28 at 08:03 -0400, Duncan Murdoch wrote:
>> On 10/27/2006 11:06 PM, Matthew Walker wrote:
>>> Hi everyone,
>>>
>>> I think I have found a minor issue with the R function "boxplot.stats".
>>> But before I make such a rash comment, I'd like to check my facts by
>>> fixing what I think is the problem. However, why I try to do this, R
>>> does not behave as I expect. Can you tell me what I'm doing wrong?
>>>
>>> If I use the command:
>>> debug(boxplot.stats)
>>> I am allowed to step through the code as normal.
>>>
>>> I then want to edit the function, so I type:
>>> boxplot.stats <- edit(boxplot.stats)
>>> and I make my changes.
>>>
>>> I can check my changes have been made by typing:
>>> boxplot.stats
>>> and the updated version appears on screen.
>>>
>>> But now when I come to test my changes, the "debug" functionality has
>>> just up and disappeared; I can no longer step though the function as
>>> normal. Further to that, it appears that the change has somehow not
>>> been registered, as exactly the same error occurs---although I cannot be
>>> sure that it is occurring inside boxplot.stats.
>>>
>>> Does anyone have any tips, suggestions or comments? I'd love to be able
>>> to fix this.
>>>
>>> (For what it's worth I wish to change line 14 of boxplot.stats so that
>>> it reads "if (any(out[nna],na.rm=TRUE))".)
>> Besides what Gabor said, an issue here is that boxplot.stats lives in
>> the grDevices namespace. If you call boxplot(), it will look there
>> before it sees your locally modified copy.
>>
>> For testing, you can call boxplot.stats directly from the console, or
>> also make a local copy of boxplot.
>>
>> Not sure why boxplot.stats is in grDevices rather than graphics, but
>> that's not really relevant to your problems.
>>
>> Duncan Murdoch
>>
>
> Hi Duncan,
>
> Thanks for your reply.
>
> How do you know that (i) boxplot.stats lives in the grDevices namespace?
getAnywhere(boxplot.stats) starts out as
> getAnywhere(boxplot.stats)
A single object matching 'boxplot.stats' was found
It was found in the following places
package:grDevices
registered S3 method for boxplot from namespace grDevices
namespace:grDevices
> and (ii) how do you know/change that boxplot will look in grDevices
> before it uses the local copy?
That was actually a guess. But checking now:
> getAnywhere(boxplot)
A single object matching 'boxplot' was found
It was found in the following places
package:graphics
namespace:graphics
with value
function (x, ...)
UseMethod("boxplot")
<environment: namespace:graphics>
so boxplot() is in the graphics package, and works in that namespace.
The graphics namespace file starts out
import(grDevices)
so functions in that package will look in grDevices before they look
elsewhere. I thought that meant that S3 methods would be found there
before they're found anywhere else, but I didn't actually check this.
So let's check:
> boxplot.stats <- function(x, ...) stop("mine")
> x <- 1
> class(x) <- "stats"
> boxplot(x)
Error in boxplot.stats(x) : mine
Whoops! Looks as though my local copy does get found first. Not sure
if this is a bug...
> I tried to do as you suggested and create a local copy of boxplot. I
> used the following commands:
> boxplot.stats <- edit(boxplot.stats) # Made changes to line 14
> boxplot <- edit(boxplot)
> boxplot.default <- edit(boxplot.default) # Added a call to "cat()"
>
> When I called boxplot() the local copy was executed (as I could see the
> output of my "cat" commands), however it appears that the local copy of
> boxplot.stats isn't the one being called from my version of "boxplot".
> How do I fix this?
That's very strange. Which R version are you using? Are you sure the
wrong version was being called? I was doing my tests in 2.4.0.
Duncan Murdoch
More information about the R-help
mailing list