Tim, On May 21, 2014, at 9:54 PM, Tim Keitt <tke...@utexas.edu> wrote:
> When dealing with object holding pointers that are only valid during a single > session, it would be convenient to exclude them from being saved with the > session image. (I am assuming that `quit` calls `save.image` before quitting > or is it internal?) Currently they are saved with the pointer converted to > NULL. Its a bit surprising for users not realizing the object is no longer > valid. > than's not surprising - it's actually very useful, because it tells you that the object has been restored. Typically, packages using external pointers use this to re-inilitialize the object from serialized data or other sources if possible. > My thought is to designate a class name (perhaps "no.save") and exclude > anything that inherits from that. Why would you want to not save it? It exists, so saving it makes it possible to decide on the behavior as needed - as opposed to not saving it and thus losing the information. Cheers, Simon > I've hacked a quick implementation below. > I did not issue a warning, but it would be a simple fix. > > Does anyone else see this as useful? > > THK > > -- > http://www.keittlab.org/ > > .new.save.image = function (file = ".RData", version = NULL, ascii = FALSE, > compress = !ascii, > safe = TRUE, omit.no.save = TRUE) # added > "omit.no.save" argument > { > if (!is.character(file) || file == "") > stop("'file' must be non-empty string") > opts <- getOption("save.image.defaults") > if (is.null(opts)) > opts <- getOption("save.defaults") > if (missing(safe) && !is.null(opts$safe)) > safe <- opts$safe > if (missing(ascii) && !is.null(opts$ascii)) > ascii <- opts$ascii > if (missing(compress) && !is.null(opts$compress)) > compress <- opts$compress > if (missing(version)) > version <- opts$version > if (safe) { > outfile <- paste0(file, "Tmp") > i <- 0 > while (file.exists(outfile)) { > i <- i + 1 > outfile <- paste0(file, "Tmp", i) > } > } > else outfile <- file > on.exit(file.remove(outfile)) > > ### Omit objects inheriting from "no.save" ### > > objns <- ls(envir = .GlobalEnv, all.names = TRUE) > > if ( omit.no.save ) ### make part of options? > objns <- subset(objns, sapply(objns, function(x) > { > ! inherits(get(x, envir = .GlobalEnv), "no.save") > })) > > save(list = objns, file = outfile, > version = version, ascii = ascii, compress = compress, > envir = .GlobalEnv, precheck = FALSE) > > ### End code changes ### > > if (safe) > if (!file.rename(outfile, file)) { > on.exit() > stop(gettextf("image could not be renamed and is left in %s", > outfile), domain = NA) > } > on.exit() > } > > setClass("no.save") > setClass("test.class", slots = c(s1 = "externalptr")) > setIs("test.class", "no.save") > reg.obj = "regular object" > no.save.obj = new("test.class") > .image.file = tempfile() > save.image(.image.file) > rm(reg.obj, no.save.obj) > load(.image.file) > print(ls()) > unlink(.image.file) > .new.save.image(.image.file) > rm(reg.obj, no.save.obj) > load(.image.file) > print(ls()) > unlink(.image.file) > > [[alternative HTML version deleted]] > > ______________________________________________ > 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