Почему использование% dopar% с foreach приводит к тому, что R не распознает пакет? - PullRequest
1 голос
/ 18 октября 2019

Я пытался заставить мой код работать параллельно на R, используя пакет doParallel с пакетом foreach. Я также использую пакет sf для манипулирования файлами shp. Я удостоверился, что весь мой код работал в цикле foreach, просто используя% do%, поэтому, если произошла ошибка, я мог бы лучше отследить ее. Мой код работал нормально, используя foreach и% do%, но при изменении do% dopar% R продолжал выдавать следующую ошибку:

Ошибка в {: задача 1 не выполнена - "не удалось найти функцию"st_geometry_type" "

Несмотря на то, что я четко использую require (sf) в верхней части скрипта R. Я сделал небольшую функцию, которая просто печатает «проверить», является ли утверждение истинным, для репликации ошибки.

require(sf)
require(doParallel)
doParallel::registerDoParallel(cores = 2)

testforeach <- function(sfObject)
{
  foreach(i=1:10) %dopar% {
    if (st_geometry_type(sfObject[i,]) == "LINESTRING")
    {
      print("check")
    }
  }
}

Когда я запускаю этот код, он выдает точно такую ​​же ошибку:

Ошибка в {: задача 1 не выполнена - "не удалось найти функцию" st_geometry_type ""

Однако, когда я заменяю% dopar% на% do%, он выводит все ожидаемые сообщения "check",Это ошибка в R или я что-то упустил? Я попытался переустановить свои пакеты, но это не оказало никакого влияния, так как я продолжал получать ту же ошибку. Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 18 октября 2019

Вам необходимо включить пакеты, которые вы будете использовать внутри цикла, в функцию foreach

foreach(i=1:10,.packages="sf") %dopar% {
    if (st_geometry_type(sfObject[i,]) == "LINESTRING")
    {
      print("check")
    }
}
...