#' @rdname save.ANTsR
#' @title Save R sessions including ANTsR objects
#' @description
#' Use this function to save an object or a full R session for
#' later use. Any object can be saved (list, antsImage, data frame,
#' etc.). The function will save all antsImage objects as nifti
#' files with random filenames (to avoid using (sub)variable names,
#' which can be identical). These files is what load.ANTsR uses
#' later to fill back the original antsImage variables. For variables
#' that contain filenames, you can choose to copy those files
#' in your saved folder so you can completely recreate the environment
#' even if you change computer or the temporary folder is deleted.
#'
#' @param filename Prefix for folder to store data.
#' @param objects Vector of character names of objects to store. Can be antsImages.
#' @param env Environment to save from or load to.
#' @param overwrite logical to select whether overwriting existing data is allowed.
#' @param clonediskfiles logical enables the copying of disk files that are not loaded
#' in workspace but where character variables point. Set to TRUE if moving sessions
#' from one computer to another or if you save antsRegistration() outputs. Set to
#' FALSE if you save temporary sessions to continue later on the same computer.
#' @param ... Additional arguments to pass to \code{save}.
#'
#' @author Dorian Pustina
#'
#' @examples
#' \dontrun{ # causes problems with devtools::run_examples()
#' # a <- 1
#' # b <- c( 2, 3, 4)
#' # save.ANTsR(objects=c('b', 'a'))
#' # load.ANTsR("./.ANTsRsession")
#' }
#'
#' @export
save.ANTsR <- function(filename=file.path('.','.ANTsRsession'),
objects=NA,
env=as.environment(1),
overwrite=FALSE,
clonediskfiles=TRUE,
...) {
# convert to absolute path
filename = suppressWarnings(file.path(dirname(normalizePath(filename)),basename(filename)))
fremove1234567890 = NULL
# create or empty the target folder
if (file.exists(file.path(filename,'ANTSLOAD.Rdata')) & overwrite ) {
fnames = list.files(filename)
assign('fremove1234567890', file.path(filename,fnames) , envir = env)
} else {
dir.create(filename,showWarnings = F)
assign('fremove1234567890', '' , envir = env)
}
if (file.exists(file.path(filename,'ANTSLOAD.Rdata')) & ! overwrite ){
stop(paste('Folder', filename, 'not empty and overwrite is false.'))
}
antslist = as.list(env)
if(all(!is.na(objects))) {
index = match(objects,names(antslist))
antslist = antslist[index]
}
funimgS = function(x,fold=filename) {
file = paste0(paste(sample(c(0:9, letters, LETTERS), 20, replace=T),collapse=''),'.nii.gz')
fn = file.path(fold,file)
antsImageWrite(x, fn)
return(paste0('ANTSload',file))
}
funimgSf = function(x,fold=filename) {
index = which(file.exists(x))
if (length(index) == 0) return(x)
nocopy = file.exists(file.path(fold,basename(x[index])))
noremovef = file.path(fold,basename(x[index[nocopy]]))
noremoveindx = match(noremovef, fremove1234567890 )
assign('fremove1234567890', fremove1234567890[-(noremoveindx)], envir = env)
x[index[nocopy]] = paste0('ANTSrepl', basename(x[index[nocopy]]) )
index = index[! nocopy]
if (length(index) == 0) return(x)
for (indx in index) {
file = paste0(paste(sample(c(0:9, letters, LETTERS), 20, replace=T),collapse=''),
'_', basename(x[indx]))
fn = file.path(fold,file)
file.copy(x[indx],fn)
x[indx] = paste0('ANTSrepl', file)
}
return(x)
}
if (clonediskfiles) antslist = rapply(antslist, funimgSf, classes='character', how='replace')
ANTSLOAD = rapply(antslist, funimgS, classes='antsImage', how='replace')
if (file.exists(file.path(filename,'ANTSLOAD.Rdata')) && overwrite && length(fremove1234567890)>0) {
drop=file.remove(fremove1234567890) # cleanup remaining files in folder
rm(fremove1234567890,envir = env)
}
save(ANTSLOAD,file=file.path(filename,'ANTSLOAD.Rdata'), ...)
}
#' @rdname load.ANTsR
#' @title Load R sessions with ANTsR objects
#' @description
#' Loads a previously saved ANTsR session or object. Simply
#' point the function to the folder where you previously
#' saved the data with save.ANTsR.
#'
#' @param filename path of the saved ANTsR session. If not
#' specified, the default behavior is to search for the
#' folder \".ANTsRsesssion\" in the current working directory.
#'
#' @param env the environment level. Don't change unless you know
#' what are you doing.
#'
#' @usage
#' load.ANTsR(filename=file.path('.','.ANTsRsession'), env=as.environment(1))
#'
#' @author Dorian Pustina
#'
#' @export
load.ANTsR <- function(filename=file.path('.','.ANTsRsession'),
env=as.environment(1)) {
# convert to absolute path
filename = file.path(dirname(normalizePath(filename)),basename(filename))
ANTSLOAD = NULL
funimgL = function(x,fold=filename) {
if (length(x) == 1 && substr(x,1,8) == 'ANTSload') {
fn = file.path(fold, substr(x,9,nchar(x)) )
x = antsImageRead(fn)
return(x)
}
# here we replace file names in variables
# starting with ANTSrepl, which were filename vectors
# when the data were saved with save.ANTsR
#
if ( any(grepl('^ANTSrepl', x)) ) x = file.path(fold,gsub('^ANTSrepl','',x))
return(x)
}
load(file.path(filename,'ANTSLOAD.Rdata'))
antslist = rapply(ANTSLOAD, funimgL, classes='character', how='replace')
envir = list2env(antslist, envir = env)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.