I don't think anyone has yet mentioned that the canonical way to save lattice plots is to save the object produced by lattice, and print() it again when required.

recordPlot was only ever intended to be a temporary expedient, as the help page says.

On 10/01/2012 14:17, Simon Urbanek wrote:

On Jan 10, 2012, at 1:06 AM, Jeroen Ooms wrote:

The underlying problem turns out to be serialization of objects of
class "NativeSymbolInfo". When these are serialized and unserialized,
the memory address turns into a nullpointer, causing the fail. To fix
it, one can simply create new nativeSymbolInfo objects. E.g:

# The old example:
library(lattice);
histogram(rnorm(100));
x<- recordPlot();
saveRDS(x, "myplot.rds");
y<- readRDS("myplot.rds");

# y contains nullpointers making it fail.
print(y);

# To fix:
for(i in 1:length(y[[1]])) {
  if( "NativeSymbolInfo" %in% class(y[[1]][[i]][[2]][[1]]) ){
    y[[1]][[i]][[2]][[1]]<- getNativeSymbolInfo(y[[1]][[i]][[2]][[1]]$name);
  }
}
print(y);

Now this works, but it is a bit ugly. Is there a more general method
of serializing objects in a way that native objects are restored where
possible?


Unfortunately R doesn't provide a way for this. Without changes to 
unserialization (on the wishlist for a few years now, but not easy to design) 
the best you can do is to check the native symbols for NULL pointers on usage 
and then re-fetch - that's something that could be done reasonably easily, 
although it's still a hack ...








On Mon, Jan 9, 2012 at 12:47 AM, Jeroen Ooms<jeroen.o...@stat.ucla.edu>  wrote:

I use recordPlot() to save plots to disk that I render later to a
variety of formats. This works fine for base R plots and ggplot2
plots, and also used to work for lattice plots. However somewhere in
version 2.14 things stopped working for lattice plots. Here is an
example:

library(lattice);
histogram(rnorm(100));
x<- recordPlot();
saveRDS(x, "myplot.rds");
y<- readRDS("myplot.rds");
print(y);
Error: NULL value passed as symbol address

printing x works fine, but printing y either gives an error or prints
an empty page. The problem seems to be related to serializing the
recordedplot object, which contains a lot of memory pointers. Any tips
or workarounds?

sessionInfo()
R version 2.14.1 (2011-12-22)
Platform: i686-pc-linux-gnu (32-bit)

locale:
[1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=C                 LC_NAME=C
[9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] lattice_0.20-0

loaded via a namespace (and not attached):
[1] grid_2.14.1

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel



______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


--
Brian D. Ripley,                  rip...@stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to