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).
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to