On 9/21/2012 12:16 PM, Marius Hofert wrote:
Dear Martin,
thanks for helping. Is there a solution without explicitly loading snow/parallel
with library()/require()? I forgot to say, I was hoping for such a solution.
Not that I know of. Write a package and importFrom(parallel, stopCluster)?
Martin
Cheers,
Marius
Martin Morgan <mtmorgan at fhcrc.org> writes:
On 09/21/2012 12:47 AM, Marius Hofert wrote:
Dear expeRts,
If I run the minimal example below, I obtain:
Loading required package: Rmpi
Loading required package: grDevices
Loading required package: grDevices
Loading required package: grDevices
Loading required package: grDevices
4 slaves are spawned successfully. 0 failed.
Error in UseMethod("stopCluster") :
no applicable method for 'stopCluster' applied to an object of class "c('spawnedMPIcluster', 'MPIcluster', 'cluster')"
However, if I run the body of the function (linewise; without calling the
function), everything works. Why is that so?
Cheers,
Marius
grid <- expand.grid(a=1:4, b=2:10)
ngrid <- nrow(grid)
f <- function(x) sum(x)
ex <- function() {
cl <- snow::makeCluster(parallel::detectCores(), type="MPI")
on.exit(snow::stopCluster(cl))
RNGkind("L'Ecuyer-CMRG")
parallel::clusterExport(cl, varlist=c("f", "grid"))
parallel::clusterApply(cl, seq_len(ngrid), function(i) f(grid[i,]))
}
res <- ex()
An even more minimal example is
ex <- function() {
cl <- snow::makeCluster(parallel::detectCores(), type="MPI")
snow::stopCluster(cl)
}
res <- ex()
To be clear, there is no library(snow) in the script, and on.exit() is not
relevant. The reason is that snow::stopCluster is an S3 generic, and on the help
page ?NextMethod we have
Namespaces can register methods for generic functions. To support
this, 'UseMethod' and 'NextMethod' search for methods in two
places: first in the environment in which the generic function is
called, and then in the registration data base for the environment
in which the generic is defined (typically a namespace). So
methods for a generic function need to be available in the
environment of the call to the generic, or they must be
registered. (It does not matter whether they are visible in the
environment in which the generic is defined.)
There are no stopCluster methods defined in the calling namespace (i.e., your
script) and since there has been no call to library(snow), there is no snow
namespace to search and hence no method to be found.
The solution is to add
library(snow)
to the script (or better library(parallel) and use the 'parallel' library
throughout).
Martin