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

Позвольте мне добавить еще одну проблему с областью видимости в 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 ]

4 голосов
/ 04 октября 2010

Я думаю, что вы хотите 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
2 голосов
/ 04 октября 2010

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

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

...