2012-04-10 21 views
22

Tôi đang cố gắng chạy mã trên một số lõi (Tôi đã thử cả hai gói snowparallel). Tôi cóparSapply không tìm thấy các đối tượng trong môi trường toàn cầu

cl <- makeCluster(2) 
y <- 1:10 
sapply(1:5, function(x) x + y) # Works 
parSapply(cl, 1:5, function(x) x + y) 

Dòng cuối cùng trả về lỗi:

Error in checkForRemoteErrors(val) : 
    2 nodes produced errors; first error: object 'y' not found 

Rõ ràng parSapply không tìm y trong môi trường toàn cầu. Có cách nào để giải quyết vấn đề này không? Cảm ơn.

Trả lời

20

Các nút không biết về y trong môi trường toàn cục trên máy chủ. Bạn cần phải nói với họ bằng cách nào đó.

library(parallel) 
cl <- makeCluster(2) 
y <- 1:10 
# add y to function definition and parSapply call 
parSapply(cl, 1:5, function(x,y) x + y, y) 
# export y to the global environment of each node 
# then call your original code 
clusterExport(cl, "y") 
parSapply(cl, 1:5, function(x) x + y) 
5

Điều đáng nói rằng ví dụ của bạn sẽ làm việc nếu parSapply được gọi từ bên trong một hàm, mặc dù vấn đề thực sự là nơi mà các chức năng function(x) x + y được tạo ra. Ví dụ, đoạn mã sau hoạt động chính xác:

library(parallel) 
fun <- function(cl, y) { 
    parSapply(cl, 1:5, function(x) x + y) 
} 
cl <- makeCluster(2) 
fun(cl, 1:10) 
stopCluster(cl) 

Điều này là do chức năng được tạo ra trong các chức năng khác được đăng cùng với môi trường địa phương, trong đó họ đã được tạo ra, trong khi chức năng được tạo ra từ môi trường toàn cầu không được đăng cùng với môi trường toàn cầu. Điều này có thể hữu ích vào các thời điểm, nhưng nó cũng có thể dẫn đến một loạt các vấn đề nếu bạn không biết vấn đề.

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