From hb at stat.berkeley.edu  Thu May 25 09:19:28 2006
From: hb at stat.berkeley.edu (Henrik Bengtsson)
Date: Thu, 25 May 2006 00:19:28 -0700
Subject: [Rd] save() saves extra stuff if object is not evaluated
Message-ID: <59d7961d0605250019x37e8da24id38e13f98e41f9ae@mail.gmail.com>

Hi,

it looks like save() is saving all contents of the calling
environments if the object to be saved is *not* evaluated, although it
is not that simple either.  After many hours of troubleshooting, I'm
still confused.  Here is a reproducible example (also attached) with
output.  I let the code and the output talk for itself:

peek <- function(file, from=1, to=500) {
  cat("--------------------------------------\n")
  cat(sprintf("%s: %d bytes\n", file, file.info(file)$size))
  bfr <- suppressWarnings(readBin(file, what="character", n=to))
  bfr <- gsub("(\001|\002|\003|\004|\005|\016|\020|\036|\a|\n|\t)", "", bfr);
  bfr <- bfr[nchar(bfr) > 0];
  cat(bfr, sep="", "\n");
}

saveCache <- function(file, y, sources=NULL, eval=FALSE) {
  if (eval)
    dummy <- is.null(sources)
  base::save(file=file, sources, compress=FALSE)
}

aVariableNotSaved <- double(1e6)

main <- function() {
  # This 'big' variable is saved in case 1 below!
  big <- rep(letters, length.out=1e5)
  identifier <- "This string will be saved too!"

  y <- 1

  file <- "a.RData"
  saveCache(y, file=file)
  peek(file)

  file <- "a-eval.RData"
  saveCache(y, file=file, eval=TRUE)
  peek(file)

  file <- "b-noy.RData"
  saveCache(file=file)
  peek(file)

  file <- "b-noy-eval.RData"
  saveCache(file=file, eval=TRUE)
  peek(file)
}


# 1. Call saveCache() outside main()
eval(body(main))
# --------------------------------------
# a.RData: 238 bytes
# RDX2Xsources?filea.RData y?n $  n?$eval???n?
# --------------------------------------
# a-eval.RData: 58 bytes
# RDX2Xsources??
# --------------------------------------
# b-noy.RData: 230 bytes
# RDX2Xsources?file?b-noy.RData ?yv$  n?$eval???n?
# --------------------------------------
# b-noy-eval.RData: 58 bytes
# RDX2Xsources??

# 2. Call saveCache() from within main()
main()
# --------------------------------------
# a.RData: 900412 bytes
# RDX2Xsources?filea.RData y? a.RData ?=identifierThis
# string will be saved too!big??abcdefghijklmnopqrstuv
# wxyzabcdefghijklmnopqrstuvwxyzabcdefg
# --------------------------------------
# a-eval.RData: 58 bytes
# RDX2Xsources??
# --------------------------------------
# b-noy.RData: 230 bytes
# RDX2Xsources?file?b-noy.RData ?yv$  n?$eval???n?
# --------------------------------------
# b-noy-eval.RData: 58 bytes
# RDX2Xsources??

What is going on?

I get this on both R v2.3.0 patched (2006-04-28 r37936) and R v2.3.1
beta (2006-05-23 r38179) on my WinXP (with Rterm --vanilla).


[Rd] save() saves extra stuff if object is not evaluated
Henrik Bengtsson