[R] Bug? plot.formula does need support plot.first / plot.last param in plot.default

Erez Shomron r-m@||@ @end|ng |rom erez@h@org
Sat Jul 6 08:15:56 CEST 2024


Thanks for your answer.

Should I report in Bugzilla at least so it's tracked?

I can point that the issue is with line 6 of the function body:
```
    dots <- lapply(m$..., eval, md, eframe)
```

I assume the intention was to evaluate the arguments with the context of data passed to the function.
But the expression in panel.first / panel.last gets evaluated before plot.new is called (as the error indicates).

I believe the fix would be to somehow not evaluate line 6, or replace with `dots <- m$...`, and when `plot` is later called, to somehow evaluate it with the data passed to the function. I tried to add `envir` argument to `do.call` but it does not work as I expected.

I would've liked to contribute a patch but my R knowledge is limited and and this `plot.formula` code is a bit of my head frankly.

Kindly,
Erez


On Sat, Jul 6, 2024, at 1:05 AM, Duncan Murdoch wrote:
> That definitely looks like a bug, but not one that anyone will be eager 
> to fix.  It's very old code that tried to be clever, and that's the 
> hardest kind of code to fix.
> 
> Remember Kernighan's Law:  "Everyone knows that debugging is twice as 
> hard as writing a program in the first place. So if you’re as clever as 
> you can be when you write it, how will you ever debug it?"
> 
> Duncan Murdoch
> 
> On 2024-07-05 7:35 a.m., Erez Shomron wrote:
> > Is the following a bug in your opinion? I think so.
> > 
> > This works as expected:
> > 
> > ```
> > with(mtcars, plot(wt, mpg, plot.first = {
> >      plot.window(range(wt), range(mpg))
> >      arrows(3, 15, 4, 30)
> > }))
> > ```
> > 
> > This does not.
> > 
> > ```
> > plot(mpg ~ wt, data = mtcars, plot.first = {
> >      plot.window(range(wt), range(mpg))
> >      arrows(3, 15, 4, 30)
> > })
> > ```
> > 
> > With error:
> > ```
> > Error in arrows(3, 15, 4, 30) : plot.new has not been called yet
> > ```
> > 
> > The second example should work.
> > 
> >  From the docs:
> > 
> > ?plot.formula
> > "     For the ‘plot’ method the formula can be of the form ‘~ z + y +
> >       z’: the variables specified on the right-hand side are collected
> >       into a data frame, subsetted if specified, and displayed by
> >       ‘plot.data.frame’.
> > "
> > 
> > ?plot.data.frame
> > "     ...: further arguments to ‘stripchart’, ‘plot.default’ or ‘pairs’.
> > "
> > 
> > And plot.default has both plot.first and plot.last
> > 
> > It seems very arbitrary you can't use these parameters with the plot.formula method specifically.
> > 
> >> sessionInfo()
> > R version 4.4.1 (2024-06-14)
> > Platform: x86_64-suse-linux-gnu
> > Running under: openSUSE Tumbleweed
> > [...]
> > 
> > ______________________________________________
> > R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> > 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