parallel :: mclapply () добавляет или удаляет привязки к глобальной среде. Какие?

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 + "]");
2
задан landau 5 February 2019 в 12:28
поделиться

2 ответа

Вы можете удалить .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)

Одна заключительная мысль: вы можете создать новую среду, содержащую все вещи, которые вы не хотите изменять Закрой его и работай там.

0
ответ дан alko989 5 February 2019 в 12:28
поделиться

Я думаю, что у 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.

0
ответ дан landau 5 February 2019 в 12:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: