1## A version of base::sample() that does not change .Random.seed 2stealth_sample <- function(x, size = length(x), replace = FALSE, ...) { 3 ## Nothing to do? 4 if (size == 0L) return(x[integer(0)]) 5 6 ## Nothing to randomize? 7 if (length(x) == 1L) { 8 return(rep(x, times = size)) 9 } 10 11 oseed <- .GlobalEnv$.Random.seed 12 on.exit({ 13 if (is.null(oseed)) { 14 rm(list = ".Random.seed", envir = .GlobalEnv, inherits = FALSE) 15 } else { 16 .GlobalEnv$.Random.seed <- oseed 17 } 18 }) 19 20 ## Generate a psuedo-random random seed based on the current 21 ## random state and the current time 22 time_offset <- format(Sys.time(), format = "%H%M%OS6") 23 time_offset <- sub(".", "", time_offset, fixed = TRUE) 24 time_offset <- strsplit(time_offset, split = "", fixed = TRUE)[[1]] 25 time_offset <- sample(time_offset) 26 time_offset <- paste(time_offset, collapse = "") 27 time_offset <- as.numeric(time_offset) 28 time_offset <- time_offset %% .Machine$integer.max 29 set.seed(time_offset) 30 31 sample(x, size = size, replace = replace, ...) 32} 33