[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