Подтвердить что ты не робот

Функция не найдена в R doParallel 'foreach' - Ошибка в {: task 1 failed - "не удалось найти функцию" растровый "

Я пытаюсь использовать кластер высокой производительности в моем учебном заведении в первый раз, и я столкнулся с проблемой, которую я не могу решить.

Следующий код возвращает ошибку:

ptime<-system.time({
  r <- foreach(z = 1:length(files),.combine=cbind) %dopar% {
    raster <- raster(paste(folder,files[1],sep=""))
    data<-getValues(raster)
    clp <- na.omit(data)
    for(i in 1:length(classes)){
      results[i,z]<-length(clp[clp==classes[i]])/length(clp)
      print(z)
    }
  }
})

Error in { : task 1 failed - "could not find function "raster""

А также попробовал другой код foreach для другой задачи, которую у меня есть:

r <- foreach (i=1:length(poly)) %dopar% {
  clip<-gIntersection(paths,poly[i,])
  lgth<-gLength(clip)
  vid<[email protected][i,3]
  path.lgth[i,] <- c(vid,lgth)
  print(i)
}

и на этот раз функция gIntersection не найдена. Очевидно, что все пакеты установлены и загружены. После прочтения некоторых сообщений в форуме кажется, что это связано с тем, что функции выполняются/работают.

Кто-нибудь может помочь? Я не программист!

Спасибо!

Update:

Я скорректировал свой код для предоставленного решения:

results<-matrix(nrow=length(classes),ncol=length(files))
dimnames(results)[[1]]<-classes
dimnames(results)[[2]]<-files

ptime<-system.time({
    foreach(z = 1:length(files),.packages="raster") %dopar% {
    raster <- raster(paste(folder,files[z],sep=""))
    data<-getValues(raster)
    clp <- na.omit(data)
    for(i in 1:length(classes)){
      results[i,z]<-length(clp[clp==classes[i]])/length(clp)
      print(z)
    }
  }
})

Но то, что я получаю, является результатом (моей матрицей результатов), заполненной na. Как вы можете видеть, я создаю объект матрицы, называемый результатами для заполнения результатами (который работает с циклами), но после прочтения документации для foreach кажется, что вы сохраняете свои результаты по-разному с помощью этой функции.

И советы о том, что я должен выбрать для аргумента .combine?

4b9b3361

Ответ 1

В виньетете foreach и странице справки foreach аргумент .packages указывается при необходимости, чтобы обеспечить при использовании параллельных вычислений с функциями, которые не являются загружен по умолчанию. Таким образом, ваш код в первом примере должен быть:

ptime<-system.time({
  r <- foreach(z = 1:length(files),
               .combine=cbind, 
               .packages='raster') %dopar% {
      # some code
      # and more code
  }
})

Еще несколько объяснений

Пакет foreach выполняет множество настроек за кулисами. Что происходит, так это следующее (в принципе, технические детали немного сложнее):

  • foreach настраивает систему "рабочих", которую вы можете видеть как отдельные сеансы R, каждая из которых привязана к другому ядру в кластере.

  • Функция, которая должна быть выполнена, загружается в каждый "рабочий" сеанс вместе с объектами, необходимыми для выполнения функции

  • каждый рабочий вычисляет результат для подмножества данных

  • Результаты расчета для разных работников объединены и сообщаются в "мастер-сессии R".

Поскольку рабочих можно рассматривать как отдельные сеансы R, пакеты из "мастер-сессии" не загружаются автоматически. Вы должны указать, какие пакеты должны быть загружены в эти рабочие сеансы, и что используется аргумент .package foreach.


Обратите внимание, что при использовании других пакетов (например, parallel или snowfall) вам необходимо будет настроить этих работников явно, а также позаботиться о передаче объектов и загрузке пакетов на рабочих сеансах.