Changes in version 2.59.2 Bug fixes - The package installs again. lattice removed parallel() from its exports (it was renamed parallelplot() years ago, then deprecated, then made defunct). Because the import resolved at lazy-load time, this broke R CMD INSTALL for the whole package rather than just parplot(), and took several downstream packages with it. - QCdata() is no longer silently lost when a MethyLumiSet is subset. eSet's [ method drops the QC slot, and the previous guard tried to subset it after that had already happened — NULL[, j, drop = FALSE] returns NULL without erroring, so the guard was a no-op. QC data is now captured before dispatch and reattached. Feature indices no longer apply to QC probes, which live in their own feature space; only sample selection does. As a consequence combine() no longer reports "Dropped control probes" when combining subsets. - The example dataset mldat no longer shares its assayData between copies. It had been saved with storageMode = "environment" instead of "lockedEnvironment", so x <- mldat; methylated(x) <- ... silently mutated the original. The assay values themselves are unchanged. - plotNegOob() works again. It had two independent ggplot2 breakages: scale_y_continuous(breaks = NA) (now NULL) and opts() (removed from ggplot2 years ago, now labs()). Internal changes - .mclapply() is now a thin wrapper around BiocParallel::bplapply() instead of parallel::mclapply() behind a require(). mclapply() forks, so it degraded to serial on Windows regardless. The signature is unchanged, and parallel results are verified identical to serial results. Configure it the standard Bioconductor way, with BiocParallel::register(). - require() calls inside package code have been replaced with declared imports, or with requireNamespace() guards that produce an actionable error for genuinely optional packages (MASS, Biostrings, lumi). require() returns FALSE rather than erroring, so a missing package used to change behaviour silently. - Bare T/F are now TRUE/FALSE throughout (105 occurrences). These are ordinary variables, not reserved words, so a user with a variable named T in scope could change the meaning of a default argument. - 1:length(x), 1:nrow(x) and 1:ncol(x) are now seq_along()/seq_len(), which behave correctly when the length is zero. - Base-package functions used by the package are now properly imported, rather than resolving by accident because the packages happened to be attached. Documentation - Most man pages are generated from roxygen blocks now. The S4 class and generic documentation remains hand-written on purpose; see the note in R/data.R. - extractBarcodeAndPosition() was documented as returning three columns with numeric row and column. It returns five, and row/column are strings such as "R006"; the numeric ones are rowNumber/columnNumber. Testing and infrastructure - The package has a test suite for the first time: 36 tests covering import from IDAT and text, normalization, background correction, coercions, filtering, subsetting and every plotting entry point. - CI runs R CMD check against Bioconductor devel on GitHub Actions, replacing a .travis.yml that had not run in years. Known issues - methylumi.bgcorr() with method = "gamma" or method = "mode" does not work. It calls gamma.mle(), gamma.mode() and gamma.integral() from rGammaGamma, which is not declared as a dependency and is not available from CRAN or Bioconductor. The default noob method is unaffected. - qc.probe.plot(), plotNAs() and plotProbeNAs() still use ggplot2's deprecated qplot().