Проблема с областью видимости, когда sfApply используется внутри функции (пакетный снегопад - R)

Позвольте мне добавить еще одну проблему с областью видимости в R, на этот раз с пакетом снегопада. Если я определю функцию в моей глобальной среде и попытаюсь использовать ее позже в sfApply() внутри другой функции, моя первая функция больше не будет найдена:

#Runnable code. Don't forget to stop the cluster with sfStop()
require(snowfall)
sfInit(parallel=TRUE,cpus=3)

func1 <- function(x){
    y <- x+1
    y
}

func2 <- function(x){
    y <- sfApply(x,2,function(i) func1(i) )
    y
}

y <- matrix(1:10,ncol=2)
func2(y)
sfStop()

Это дает:

> func2(y)
Error in checkForRemoteErrors(val) : 
  2 nodes produced errors; first error: could not find function "func1"

Если я вложу свою функцию в другую функцию, она будет работать. Это также работает, когда я использую sfApply() в глобальной среде. Дело в том, что я не хочу вкладывать свою функцию func1 в эту функцию2, так как это приведет к тому, что func1 будет определяться много раз (func2 используется в структуре, подобной циклу).

Я уже пытался упростить код, чтобы избавиться от двойного цикла, но это совершенно невозможно из-за характера проблемы. Есть идеи?

2 ответа

Решение

Я думаю, что вы хотите sfExport(func1)Хотя я не уверен, если вам нужно сделать это в вашем .GlobalEnv или внутри func2, Надеюсь, это поможет...

> y <- matrix(1:10,ncol=2)

> sfExport(list=list("func1"))

> func2(y)
     [,1] [,2]
[1,]    2    7
[2,]    3    8
[3,]    4    9
[4,]    5   10
[5,]    6   11

Мне кажется, вы сейчас путаете обзор с параллельными вычислениями. Вы вызываете новые R-сеансы - и обычно перед вами стоит воссоздание среды на узлах.

Альтернативой может быть использование foreach et al. Есть примеры в документах foreach (или итератор?), Которые показывают именно это. О, видите, и Джош уже рекомендовал то же самое.

Другие вопросы по тегам