for (int i = 1; i <= 3; i++) {
if (i == 2) {
continue;
}
System.out.print("[i:" + i + "]");
попробуйте этот код в netbeans, вы поймете разницу между break и continue
for (int i = 1; i <= 3; i++) {
if (i == 2) {
break;
}
System.out.print("[i:" + i + "]");
Вы можете удалить .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)
РЕДАКТИРОВАТЬ
Я подумал о другом решении вашей проблемы, и я думаю, что это будет работать с любым 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)
Одна заключительная мысль: вы можете создать новую среду, содержащую все вещи, которые вы не хотите изменять Закрой его и работай там.
Я думаю, что у parallel:::mc.set.stream()
есть ответ. По-видимому, mclapply()
пытается удалить .Random.seed
из глобальной среды по умолчанию. Так как алгоритм RNG по умолчанию - Mersenne Twister, мы погрузимся в блок else
ниже.
> 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))
rm(".Random.seed", envir = .GlobalEnv, inherits = FALSE)
}
}
<bytecode: 0x4709808>
<environment: namespace:parallel>
Мы можем использовать mc.set.seed = FALSE
, чтобы следующий код работал, но это, вероятно, не очень хорошая идея на практике.
set.seed(0)
lockEnvironment(globalenv())
parallel::mclapply(1:2, identity, mc.cores = 2, mc.set.seed = FALSE)
Интересно, есть ли способ заблокировать окружение, в то же время позволяя нам удалить .Random.seed
.