On 01/15/2015 08:00 PM, Dario Strbenac wrote:

I don't think that is the problem. bpparam() should automatically choose
settings that work on Windows. BiocInstaller also doesn't pass the checking
process, according to the online report page. The last version that worked on
Windows was 1.11.9, so there must have been a change in 1.11.10 which caused
a problem, which remains in version 1.11.11.

I'm not sure about the archaeology, but as Dan mentioned this is related to the different ways in which parallel evaluation works by default on mac / linux (multicore) versus windows (SnowParam).

You can recreate the error on non-Windows with

    register(registered("SnowParam"))

which sets the default to Snow. Running the problematic code chunk from the vignette then reproduces the error.

I've refactored the relevant problem a bit, but you have

fun <- function(sampleFolds, sampleNumber) {
    if (verbose >= 1 && sampleNumber%%10 == 0)
        message("Processing sample set ", sampleNumber, ".")
    if (bootMode == "fold") {
        lapply(1:length(sampleFolds), function(foldIndex) {
            runTest(expression, training = unlist(sampleFolds[-foldIndex]),
                    testing = sampleFolds[[foldIndex]], params = params,
                    verbose = verbose)
        })
    }
    else {
        runTest(expression, training = sampleFolds[[1]],
                testing = sampleFolds[[2]],
                params = params, verbose = verbose)
    }
}

results <- bpmapply(fun, samplesFolds, as.list(1:length(samplesFolds)),
                    BPPARAM = parallelParams)

notice that runTest is not told explicitly about datasetName. When run on a single thread or in multicore it's being found in the calling environment. But on the new processes started by Snow it's nowhere to be found.

A solution is to write a more 'functional'-style version of 'fun()', one that does not rely on implicit variables. I did this using '...'

fun <- function(sampleFolds, sampleNumber, ...) {
    if (verbose >= 1 && sampleNumber%%10 == 0)
        message("Processing sample set ", sampleNumber, ".")
    if (bootMode == "fold") {
        lapply(1:length(sampleFolds), function(foldIndex) {
            runTest(expression, ...,
                    training = unlist(sampleFolds[-foldIndex]),
                    testing = sampleFolds[[foldIndex]], params = params,
                    verbose = verbose)
        })
    }
    else {
        runTest(expression, ...,
                training = sampleFolds[[1]],
                testing = sampleFolds[[2]],
                params = params, verbose = verbose)
    }
}

and then invoking it with enough information

results <- bpmapply(fun,
                    samplesFolds, as.list(1:length(samplesFolds)),
                    datasetName=datasetName,
                    classificationName=classificationName,
                    BPPARAM = parallelParams)

Martin


-------------------------------------- Dario Strbenac PhD Student University
of Sydney Camperdown NSW 2050 Australia
_______________________________________________ Bioc-devel@r-project.org
mailing list https://stat.ethz.ch/mailman/listinfo/bioc-devel



--
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M1 B861
Phone: (206) 667-2793

_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel

Reply via email to