[Rd] [FORGED] recordPlot/replayPlot not working with saveRDS/readRDS
Paul Murrell
paul at stat.auckland.ac.nz
Tue Apr 3 22:03:35 CEST 2018
Thanks for the fix Martin.
Paul
On 04/04/18 02:07, Martin Maechler wrote:
>>>>>> Paul Murrell <paul at stat.auckland.ac.nz>
>>>>>> on Tue, 3 Apr 2018 09:41:56 +1200 writes:
>
> > Hi What you are doing "wrong" is loading a recordedplot
> > into the same session that it was created in. The
> > saveRDS()/readRDS() works if you save in one R session and
> > then read in a different R session. The assumption is
> > that if you are still in the same session that created the
> > recordedplot you still have the recordedplot (e.g., you
> > can just do replayPlot(r) instead of replayPlot(r2). Is
> > that a bad assumption ?
>
> Not "bad", really, but somewhat *un*intuitive I believe to most
> users, including me.
> I would have done the same as Winston to check if saving and
> loading of a recorded plot work fine.
>
> Also, the error message we get is not very helpful:
>
> > saveRDS(r, 'recordedplot.rds')
> > r <- readRDS('recordedplot.rds')
> > png('test2.png')
> > replayPlot(r)
> Error: NULL value passed as symbol address
>
> {coming from deep down: checkValidSymbolId() in src/main/dotcode.c }
>
> I've pondered a bit and in the end found it easy enough to
> tryCatch() the error, and "do the right thing" instead.
> As that should typically only happen in exactly such a use case,
> the change should be "uniformly >=" the previous state.
>
> Ideally, maybe we (R core) would provide an R level API to a
> "TRUE/FALSE" valued version of checkValidSymbolId() or its
> caller, so that *from R code* one could check if the
> recordedplot 'x' passed to replayPlot() with its external
> pointers needs to be fixed up by
> x <- restoreRecordedPlot(x)
> or not.
>
> But that would be another topic I'd not get envolved deeply just now.
>
> Martin
>
>> Paul
>>
>> On 03/04/18 05:23, Winston Chang wrote:
>>> The documentation for recordPlot says the following:
>>>
>>>> As of R 3.3.0, it is possible (again) to replay a plot from another R session using, for example, saveRDS and readRDS.
>>>
>>> However, I haven't been able to save and restore a plot displaylist
>>> and have it work within the same R session, using R 3.4.3 or 3.3.3.
>>> Here's an example:
>>>
>>> # Save displaylist for a simple plot
>>> png('test.png')
>>> dev.control(displaylist ="enable")
>>> plot(1:5, 1:5)
>>> r <- recordPlot()
>>> dev.off()
>>>
>>> # Replay plot. This works.
>>> png('test1.png')
>>> replayPlot(r)
>>> dev.off()
>>>
>>> # Save the plot and load it, then try to replay it. This does not work.
>>> saveRDS(r, 'recordedplot.rds')
>>> r2 <- readRDS('recordedplot.rds')
>>> png('test2.png')
>>> replayPlot(r2) ## Error: NULL value passed as symbol address
>>> dev.off()
>>>
>>>
>>> Is there something that I'm doing wrong here?
>>>
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>> --
>> Dr Paul Murrell
>> Department of Statistics
>> The University of Auckland
--
Dr Paul Murrell
Department of Statistics
The University of Auckland
Private Bag 92019
Auckland
New Zealand
64 9 3737599 x85392
paul at stat.auckland.ac.nz
http://www.stat.auckland.ac.nz/~paul/
More information about the R-devel
mailing list