[R-sig-hpc] Error in UseMethod("stopCluster") : no applicable method for 'stopCluster' ...

Marius Hofert marius.hofert at math.ethz.ch
Fri Sep 21 21:16:55 CEST 2012


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.

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
>
>
>>
>> _______________________________________________
>> R-sig-hpc mailing list
>> R-sig-hpc at r-project.org
>> https://stat.ethz.ch/mailman/listinfo/r-sig-hpc
>>



More information about the R-sig-hpc mailing list