From jeroen.ooms at stat.ucla.edu  Tue Jan 10 07:06:13 2012
From: jeroen.ooms at stat.ucla.edu (Jeroen Ooms)
Date: Mon, 9 Jan 2012 22:06:13 -0800
Subject: [Rd] serializing recordedplot object
In-Reply-To: <CABFfbXvzRJZ-72v6EqyvZyUi4NtNVn-BforTc-2+hP6GxU_Pag@mail.gmail.com>
References: <CABFfbXvzRJZ-72v6EqyvZyUi4NtNVn-BforTc-2+hP6GxU_Pag@mail.gmail.com>
Message-ID: <CABFfbXu9mycTn0Ctt1Rsre7JwF5+cxjkeJeLrTOOF9Cov_H9sw@mail.gmail.com>

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?






On Mon, Jan 9, 2012 at 12:47 AM, Jeroen Ooms <jeroen.ooms at 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



[Rd] serializing recordedplot object
Jeroen Ooms