Проблема с областью видимости, когда 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 (или итератор?), Которые показывают именно это. О, видите, и Джош уже рекомендовал то же самое.