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

Marius Hofert marius.hofert at math.ethz.ch
Sat Sep 22 18:21:31 CEST 2012


That's interesting, the same script (with the same call) fails for me. I had to
put sessionInfo() earlier in the script so that it is printed. Below is the
output of the script. 

I further experimented with it, it runs if I additionally put in
'library(snow)'. I thought I don't need that if I use 'parallel' (?). Hmmm...

Cheers,

Marius

> library(parallel)
> 
> sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=C                 LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods  
[8] base     
> 
> ex <- function() {
+      cl <- makeCluster(detectCores(), type="MPI")
+      stopCluster(cl)
+ }
> res <- ex()
Loading required package: Rmpi
	4 slaves are spawned successfully. 0 failed.
Error in NextMethod() : 'NextMethod' called from an anonymous function
Calls: ex ... stopCluster.spawnedMPIcluster -> <Anonymous> -> NextMethod
Execution halted


Martin Morgan <mtmorgan at fhcrc.org> writes:

> On 09/22/2012 08:52 AM, Marius Hofert wrote:
>> Dear Martin,
>>
>> Thanks for your help. I tried to put in library(parallel) in your example (see
>> below), but I still obtain
>>
>> ,----
>> | Error in NextMethod() : 'NextMethod' called from an anonymous function
>> `----
>>
>> Do you know why?
>>
>> Cheers,
>>
>> Marius
>>
>> grid <- expand.grid(a=1:4, b=2:10)
>> ngrid <- nrow(grid)
>> f <- function(x) sum(x)
>>
>> library(parallel)
>>
>> ex <- function() {
>>      cl <- makeCluster(detectCores(), type="MPI")
>>      stopCluster(cl)
>> }
>>
>> res <- ex()
>
> For the file script.R
>
> library(parallel)
> ex <- function() {
>     cl <- makeCluster(detectCores(), type="MPI")
>     stopCluster(cl)
> }
> res <- ex()
> sessionInfo()
>
> The command
>
>   R --vanilla -f script.R
>
> 'works for me' with
>
>> sessionInfo()
> R version 2.15.1 Patched (2012-08-26 r60438)
> Platform: x86_64-unknown-linux-gnu (64-bit)
>
> locale:
>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
>  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
>  [7] LC_PAPER=C                 LC_NAME=C
>  [9] LC_ADDRESS=C               LC_TELEPHONE=C
> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
>
> attached base packages:
> [1] parallel  stats     graphics  grDevices utils     datasets  methods
> [8] base
>
> other attached packages:
> [1] Rmpi_0.6-1
>
> loaded via a namespace (and not attached):
> [1] snow_0.3-10
>
>>
>>
>>
>> Martin Morgan <mtmorgan at fhcrc.org> writes:
>>
>>> 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
>>>>>
>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> 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