2010-10-04 30 views
5

Hãy để tôi thêm một vấn đề phạm vi khác trong R, lần này với gói tuyết rơi. Nếu tôi xác định một hàm trong môi trường toàn cầu của tôi, và tôi cố gắng sử dụng một mà sau này trong một sfApply() bên trong chức năng khác, chức năng đầu tiên của tôi là không tìm thấy bất kỳ hơn:Phạm vi vấn đề khi sfApply được sử dụng trong chức năng (gói tuyết rơi - R)

#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() 

Điều này cho phép:

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

Nếu tôi lồng chức năng của mình vào bên trong chức năng khác, tuy nhiên, nó hoạt động. Nó cũng hoạt động khi tôi sử dụng sfApply() trong môi trường toàn cục. Thing là, tôi không muốn lồng hàm func1 của tôi bên trong hàm đó2, vì điều đó sẽ khiến cho func1 được định nghĩa nhiều lần (func2 được sử dụng trong một cấu trúc giống như vòng lặp).

Tôi đã thử đơn giản hóa mã để loại bỏ vòng lặp kép, nhưng điều đó hoàn toàn không thể do tính chất của sự cố. Bất kỳ ý tưởng?

Trả lời

4

Tôi nghĩ bạn muốn sfExport(func1), mặc dù tôi không chắc liệu bạn có cần làm điều đó trong số .GlobalEnv hoặc bên trong của func2 hay không. Hy vọng rằng sẽ giúp ...

> 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 
+0

trong '.GlobalEnv' là hoàn hảo. Tôi đã thêm một ví dụ nhỏ. Cám ơn! –

+0

@Joris, bạn được chào đón. Xin lỗi tôi đã không giải thích _why_ bạn cần phải xuất khẩu, nhưng may mắn Dirk cung cấp thông tin đó. ;-) –

2

Methinks bây giờ bạn đang bối rối khó hiểu với tính toán song song. Bạn đang gọi các phiên R mới --- và thường bạn có trách nhiệm tạo lại môi trường của bạn trên các nút.

Cách khác là sử dụng foreach et al. Có các ví dụ trong tài liệu foreach (hoặc iterator?) Hiển thị chính xác điều này. Oh, xem, và Josh đã đề nghị cùng một điều.

+2

Tôi chỉ nghĩ rằng tuyết rơi sẽ tạo ra một bản sao của .GlobalEnv cho nô lệ, mà nó không. Nó chỉ tạo một bản sao của env cục bộ cho các nô lệ (do đó mã được làm việc với func1 lồng nhau trong func2). Bạn có quyền truy cập vào .GlobalEnv từ bên trong sfApply. Nó chỉ không phải là .GlobalEnv Tôi nghĩ rằng nó sẽ là ... giải pháp của Joshua (sfExport) và các chức năng liên quan làm các trick. thx cho lời giải thích –

Các vấn đề liên quan