Вы можете удалить .Random.seed
самостоятельно, прежде чем заблокировать среду. Также вам нужно загрузить библиотеку (или использовать функцию раньше) и присвоить tmp
чему-либо.
library(parallel)
tmp <- NULL
rm(".Random.seed", envir = .GlobalEnv, inherits = FALSE)
lockEnvironment(globalenv())
tmp <- parallel::mclapply(1:2, identity, mc.cores = 2)
Конечно, это не позволит функциям, которым требуется .Random.seed
, как rnorm
, работать.
Обходной путь должен изменить вид RNG на "L'Ecuyer-CMRG", см. Также здесь ?nextRNGStream
:
library(parallel)
tmp <- NULL
RNGkind("L'Ecuyer-CMRG")
lockEnvironment(globalenv())
tmp <- parallel::mclapply(1:2, rnorm, mc.cores = 2)
EDIT
Я подумал о другом решении вашей проблемы, и я думаю, что это будет работать с любым RNG (не тестировал много). Вы можете переопределить функцию, которая удаляет .Random.seed
, с помощью функции, которая просто устанавливает ее на NULL
library(parallel)
mc.set.stream <- function () {
if (RNGkind()[1L] == "L'Ecuyer-CMRG") {
assign(".Random.seed", get("LEcuyer.seed", envir = RNGenv),
envir = .GlobalEnv)
} else {
if (exists(".Random.seed", envir = .GlobalEnv, inherits = FALSE)) {
assign(".Random.seed", NULL, envir = .GlobalEnv)
}
}
}
assignInNamespace("mc.set.stream", mc.set.stream, asNamespace("parallel"))
tmp <- NULL
set.seed(0)
lockEnvironment(globalenv())
tmp <- parallel::mclapply(1:2, rnorm, mc.cores = 2)
Одна заключительная мысль: вы можете создать новую среду, содержащую все вещи, которые вы не хотите менять, заблокировать и работать там.