If you use NACHO 2, you can stay on NACHO 2.*, or convert your saved objects with upgrade_nacho() and read_nacho().
The article "Moving from NACHO 2" on the package website maps NACHO 2 code to NACHO 3.
R/nacho-class.R, R/accessors.R and R/methods.R,
load_rcc() and normalise() return an S7 nacho object.
Read it with nacho_counts(), nacho_samples(), nacho_probes() and nacho_qc().
The $nacho long table and the other list slots are gone; as.data.frame(x, long = TRUE) gives the long layout.print() shows a short summary, and the full report comes from render().GSE74821 no longer stores it.R/conditions.R,
nacho_error_bad_argument, so your code can catch the ones it expects.R/load_rcc.R,
load_rcc() refuses duplicated sample ids in single-sample RCC files.
PlexSet files can repeat an id, because plexset_id tells their samples apart.load_rcc() refuses RCC files whose probes clash, that is, share a name but differ in code class or accession, and the error names those probes.load_rcc() refuses an RCC sample that repeats a probe name, with a clear error.housekeeping_genes, housekeeping_predict = TRUE or housekeeping_norm = TRUE.R/accessors.R and R/normalise.R,
nacho_qc() replaces is_outlier with a status for each metric, n_flags, an overall status and a readable reason.
check_outliers() is gone, because the status always follows the object's thresholds.exclude_outliers() drops the flagged samples and normalises the rest again.
normalise() no longer has remove_outliers.R/autoplot.R,
autoplot() takes the plot name in type instead of x, and points NACHO 2 code that still passes x to the new argument.R/render.R,
render() builds the report with Quarto instead of R Markdown, as a self-contained HTML file, or as a Typst PDF with format = "typst".
It needs the Quarto command-line interface 1.9.18 or newer, which RStudio and Positron bundle.render() takes the object as x, writes nacho-report.html or nacho-report.pdf to output_dir, and returns the path.
output_file, show_outliers and clean are gone.R/thresholds.R,
nacho_thresholds(preset = "legacy") keeps the NACHO 2 limits, and with background = "geo", background_mode = "subtract" it gives the NACHO 2 outlier calls back.R/qc.R,
background = "none").
Choose a statistic with background, and whether to threshold or subtract with background_mode.
background = "geo", background_mode = "subtract" gives the NACHO 2 correction, and subtracting floors the counts at 0.Negative_factor is always the geometric mean of the kept negative controls, with normalisation_method = "GLM" too.
The new Background column holds the background that was applied.
So with "GLM", normalised counts differ from NACHO 2, which subtracted the model intercept.housekeeping_predict = TRUE picks the five most stable genes by geNorm, among the genes above background in at least 90% of samples, instead of the five with the smallest spread.R/interop.R,
as_nacho() no longer normalises a miRNA SummarizedExperiment without saved settings with housekeeping genes, unless you set housekeeping_norm = TRUE or give housekeeping_genes.R/deploy.R,
deploy() has no default directory any more, so pass the folder yourself; it used to be /srv/shiny-server.DESCRIPTION,
R/visualise.R,
visualise() returns the tuned object when you click "Done", and no longer writes nacho_object.rds to tempdir().R/render.R,
render() gains title and author for the report cover, and the Export page of the app has the same fields.render() gains group, which adds the batch design and its cross-tables, and warns when batch and biology are confounded.R/nacho-class.R, R/accessors.R and R/methods.R,
x[, j] subsets samples and x[i, ] subsets probes, and both recompute the PCA and the outlier flags.
Subsetting probes, or filter_detected(), also removes the dropped genes from the housekeeping_genes setting.
When none are left, the object warns that it uses its Housekeeping probes, or, when it has none, turns housekeeping_norm off with a warning.R/read_nacho.R,
upgrade_nacho() converts a NACHO 2 object, and read_nacho() reads an object saved by any NACHO version.background = "geo", background_mode = "subtract", so they keep their NACHO 2 flags and background correction.
Use normalise() to switch them to the nSolver preset.print() and format() on a NACHO 2 object show one line that points to upgrade_nacho().
summary(), as.data.frame(), [ and autoplot() refuse it with a classed error.R/interop.R,
as_summarized_experiment() and as_nacho() convert between nacho objects and SummarizedExperiment.
as_nacho() also reads a NanoStringRccSet from NanoStringNCTools, with the same probe names as load_rcc() on the same RCC files.R/nacho-class.R,
-Inf as a lower bound, Inf as an upper bound, and -Inf as LoD, to mean no bound.
normalise(), upgrade_nacho() and read_nacho() refuse NaN, an Inf lower bound, a negative upper bound and an Inf LoD, with a classed error.
To read a saved object with LoD = Inf, first change it to a finite value or -Inf.
autoplot() draws no threshold line for an open bound, summary() shows it as NA, and the report leaves it out.R/thresholds.R and R/load_rcc.R,
nacho_thresholds() builds thresholds for the MAX, FLEX, PRO and SPRINT instruments.
load_rcc() gains instrument and preset, and reads the instrument from MAX/FLEX files.
When it can't read the instrument, it warns with class nacho_warning_instrument_unknown and uses the MAX/FLEX values.R/thresholds.R, R/mod_thresholds.R and R/mod_export.R,
write_thresholds() saves thresholds to a YAML file and read_thresholds() reads them back, so you can use one set of limits for every study.
The Export page of the app writes the same file, and the Preset section of the sidebar loads it.
A file without a miRNA threshold takes it from the preset named in the file.R/detection.R and R/accessors.R,
nacho_samples() gains Detection_rate, the share of endogenous genes each sample detects, and nacho_probes() gains detection_rate, the share of samples that detect each gene.filter_detected(x, min_rate) keeps the genes detected often enough, where min_rate is the share of samples in which a gene must be detected.R/qc-table.R,
nacho_qc() has a lane_status, and a lane that fails flags its eight samples.
Their reason reads "lane fails" followed by the metric name.R/methods.R,
print() lists the excluded negative probes.R/qc.R,
NA, with one warning.nacho_qc() flags samples with too few housekeeping genes above background.
Housekeeping_detected holds the count, and the nSolver preset flags a sample below 3, while the legacy preset uses 0 and never flags.Detection_rate and Housekeeping_detected are missing.
load_rcc() then gives one metric_unavailable warning that names those samples.normalisation_method reads "GEO", and provenance$glm_fallback lists the samples that failed.R/conditions.R,
options(nacho.quiet = TRUE) silences the progress and informative messages.R/load_rcc.R,
load_rcc() and normalise() check their arguments before they read any file.load_rcc() reads gzipped RCC files directly, and accepts files with Windows line endings.background and background_mode choose how the negative controls correct each sample.R/normalise.R,
normalise() checks outliers_thresholds before it runs.?normalise documents the order of the normalisation steps.outliers_thresholds in normalise(), it recalculates the flags without rebuilding the object.normalise() refuses a thresholds list written for NACHO 2, one without preset, and the error points to nacho_thresholds().R/autoplot.R,
autoplot() checks that colour and outliers_labels name columns of nacho_samples(), and outliers_labels must be a column name.autoplot() gains dark, which draws the plot for a dark background, with amber flags.inst/extdata/,
GSE346526 holds six mRNA samples in RCC files written by nSolver 4.0.1.8, the most recent nSolver version on GEO in October 2026.inst/brand/,
R/stability.R,
housekeeping_stability() ranks reference genes with geNorm and NormFinder, gives the geNorm pairwise variation, and tests each gene against a biological group.
autoplot(x, type = "Stability") draws the ranking.R/ruv.R,
normalisation_method = "RUVg" removes unwanted variation estimated from the housekeeping genes, and adds the factors to nacho_samples() as W_1, W_2, and so on.
suggest_ruv_k() suggests how many factors to remove.
normalise() lowers an explicit ruv_k to two less than the number of samples, or to one less than the number of control genes, with a nacho_warning_ruv_k_reduced warning, because a larger k fits the samples exactly.R/mirna.R,
normalisation_method = "stable_mirna", "total_mirna", "spike_in" and "ligation".nacho_qc() checks the ligation controls of miRNA panels, and nacho_thresholds(haemolysis = TRUE) flags haemolysed plasma and serum samples.load_rcc() warns when more than half of the samples fail Ligation_NEG, and shows how to relax the threshold.
This happens with whole-blood RNA, where miRNAs from red blood cells raise LIG_NEG_A.R/batch.R and R/autoplot.R,
batch_diagnostics() crosses the study groups with cartridges and dates, with Cramér's V and a flag when a batch holds a single group.
It also tests the QC metrics against each batch, and measures how much of each principal component each batch explains.
autoplot() draws "RLE", "BatchFactors" and "PCBatch".R/app.R,
nacho_app() returns the app as a Shiny app object, so you can run it from any R session or deploy it.
deploy() copies a one-line app.R that calls it, and the "Done" button only appears with nacho_app(done = TRUE), which visualise() uses.load_rcc(), normalise() and the thresholds you set.R/mod_data.R,
DESCRIPTION,
vignettes/,
R/read_rcc.R, R/load_rcc.R and R/qc.R,
load_rcc() reads each RCC file once, with exact section tags, and computes quality control on count matrices.
Loading 768 samples takes about 2.5 seconds, against about 9 in NACHO 2.R/autoplot.R,
R/mod_qc_plot.R and R/plot_worker.R,
options(nacho.plot_workers = n) sets the number of workers, and 0 builds the plots in the app process; the app from deploy() uses one worker.
If a worker stops while the app runs, the app builds the plots itself.R/mod_data.R,
R/app.R,
R/autoplot.R,
autoplot() draws samples with a missing outlier flag as ordinary points, where NACHO 2 left them out of the plot.R/render.R,
render() no longer deletes a folder named tmp_nacho in output_dir.R/read_rcc.R,
Messages, no longer breaks parsing.| field, so protein names such as 4E-BP1(53H11)|NA|EIF4EBP1|53H11|0 stay intact.
Only a trailing pipe and number, such as |0 or |0.014, is removed.| followed by digits, such as the comment Batch|2, are kept as written.R/load_rcc.R,
load_rcc() checks a plexset_id column when you supply one.
Values outside S1 to S8, and an id that repeats with the same plexset_id, raise a classed error before any file is read into a matrix.load_rcc() says when the sample sheet lists no file to read, instead of failing with an internal error.R/qc.R,
inst/app/,
R CMD check runs it.autoplot(),
"PN" and "NORM" plots, which silences the ggplot2 geom_smooth() message.DESCRIPTION,
include_graphics(rel_path = FALSE)."PFNF" and "HF" plots.inst/app/,
shiny::callModule() with shiny::moduleServer().file-arrow-up and circle-info.R/,
stringsAsFactors = FALSE from data.frame() and as.data.frame() calls, where it is the default since R 4.0.0.outliers = FALSE instead of outlier.shape = NA.vignettes/, README.Rmd and the render() report template,
#| YAML comments, which needs knitr 1.35 or newer.pak::pak() instead of remotes::install_github().vignettes/,
NS_H_miR_1.4 CodeSet, since its two CodeSets come from different nSolver versions and load_rcc() refuses files that mix versions.dcast() and as.data.table().pkgdown/,
R/normalise.R, R/load_rcc.R and vignettes/NACHO.Rmd,
raw_counts and normalised_counts slots, which never existed, and say that nacho holds one row per sample and probe.R/GSE74821.R,
GSE74821 holds 48 samples, not 20.inst/CITATION,
person() objects, so the citation shows their full initials and spells Leen M. 't Hart correctly.R/autoplot.R,
colour for the control probe plots."PFNF" and "HF" plots to the panel edges without log-10 warnings about infinite values."BD", "FoV", "PCL", "LoD", "PN", "Positive", "Negative" and "Housekeeping" plots, which drew every point at one position and dropped some of them.R/render.R,
outliers_labels = "CartridgeID" works and column names with quotes no longer break the report.inst/app/app.R,
all.rdata debug file to the working directory when uploading RCC files.suppressMessages() received x instead of expr.ssheet_dt.DESCRIPTION,
visualise() ask for it when it is not installed. The deploy() help page notes that the server needs it too.R/geometric_housekeeping.R,
House_factor. (#53)R/qc_pca.R,
PC01 to PC10 and the variance explained change, and the PCA plots now show the main sources of variation between samples.R/normalise_counts.R,
housekeeping_predict = TRUE, the floor can change which housekeeping genes are picked, which in turn changes House_factor, the normalised counts and the outlier flags.R/qc_pca.R and R/normalise_counts.R,
load_rcc() again to refresh them.R/normalise.R,
n_comp passed to normalise(), which was ignored.is_outlier when only the thresholds change.R/qc_features.R, R/qc_limit_detection.R and R/check_outliers.R,
PCL and LoD as NA when a panel has no POS_E probe or when the negative controls do not vary, and do not flag a sample on a metric that could not be measured.R/load_rcc.R,
plexset_id S1 to S8 when the sample sheet lists each file once.data.table.R/print.R,
print().data/,
GSE74821 with the corrected PCA and normalised counts.inst/app/,
application/zip, and .RCC, .rcc, .RCC.gz and .csv files in any case.R/qc_positive_control.R,
R/autoplot.R,
height in ggplot2::position_jitter() to 0 to avoid vertical dispersion points. (#45)inst/app/www/about-nacho.md,
tests/testthat/test-load_rcc.R,
Full Changelog: https://github.com/mcanouil/NACHO/compare/v2.0.4...v2.0.5
inst/CITATION,
citEntry to bibentry from CRAN note.Full Changelog: https://github.com/mcanouil/NACHO/compare/v2.0.3...v2.0.4
DESCRIPTION,
Full Changelog: https://github.com/mcanouil/NACHO/compare/v2.0.2...v2.0.3
DESCRIPTION,
ggbeeswarm.Full Changelog: https://github.com/mcanouil/NACHO/compare/v2.0.1...v2.0.2
DESCRIPTION,
Full Changelog: https://github.com/mcanouil/NACHO/compare/v2.0.0...v2.0.1
data.table instead of dplyr/tidyr/purrr.shiny application. #36Full Changelog: https://github.com/mcanouil/NACHO/compare/v1.1.0...v2.0.0
DESCRIPTION,
ggplot2 version (>= 3.3.0).dplyr version (>= 1.0.2).R/autoplot.R,
ggplot2::expand_scale() with ggplot2::expansion().R/load_rcc.R,
dplyr::progress_estimated().R/norm_glm.R,
dplyr::progress_estimated().tests,
DESCRIPTION,
R/normalise.R,
normalise() without removing outliers (#26).R/GSE74821.R,
data-raw root directory.R/-,
Rd files for internal functions.R/load_rcc.R and R/normalise.R.file.path() in examples and vignette.R/autoplot.R, reduce alpha for ellipses.inst/app/utils.R, set default point size (also for outliers) to 1.R/load_rcc.R, use inherits() instead of class().R/conflicts.R,
NACHO.nacho_conflicts() can be used to print conflicts.inst/app/, (#4, #5 & #14)
visualise(), to load "nacho" object from load_rcc() (previous summarise())
or from normalise().deploy() (R/deploy.R) function to easily deploy (copy) the shiny app.inst/extdata/.NACHO-analysis, which describe how to use limma or other model after using --NACHO--.DESCRIPTION,
summarise() and summarize() have been deprecated and replaced with load_rcc(). (#12 & #15)raw_counts and normalised_counts) are no longer (directly) available,
-i.e.-, counts are available in a long format within the nacho slot of a nacho object.visualise(), now uses a new shiny app (inst/app/).R/visualise.R, R/render.R, print(), R/load_rcc.R and R/normalise.R,
check_outliers().R/visualise.R, replace datatable (render and output) with classical table. (#13)R/autoplot.R,
show_outliers to show outliers differently on plots (-i.e.-, in red).outliers_factor to highlight outliers with different point size.outliers_labels to print labels on top of outliers._S-) to remove duplicated QC metrics.R/print.R, now print a table with outliers if any (with echo = TRUE).R/GSE74821.R, dataset is up to date according to NACHO functions.DESCRIPTION, add "SystemRequirements: pandoc (>= 1.12.3) - http://pandoc.org, pandoc-citeproc".R/render.R,
opts_chunk::knitr in roxygen documentation.sessioninfo::session_info in roxygen documentation.tests/testthat/test-render.R, now checks if pandoc is available.tests/testthat/test-summarise.R, fix tests when connection to GEO is alternatively up/down between two tests.autoplot() allows to plot a chosen QC plot available in the shiny app (visualise()) and/or
in the HTML report (render()).print() allows to print the structure or to print text and figures formatted using markdown
(mainly to be used in a R Markdown chunk).render() render figures from visualise() in a HTML friendly output.R/read_rcc.R, R/summarise.R,
R/summarise.R,
autoplot().tidyr 1.0.0 (#9).R/normalise.R,
autoplot().outliers_thresholds component in returned object.R/visualise.R,
app object in non-interactive session.vignettes/NACHO.Rmd,
tests/testthat/test-summarise.R, add condition to handle when GEOQuery is down and cannot retrieve online data.vignettes/NACHO.Rmd, add condition to handle when GEOQuery is down and cannot retrieve online data.R/summarise.R, put example in if (interactive()) {...} instead of \dontrun{...}.R/normalise.R, put example in if (interactive()) {...} instead of \dontrun{...}.R/visualise.R, put example in if (interactive()) {...} instead of \dontrun{...}.DESCRIPTION and README, description updated for CRAN, by adding "messenger-RNA/micro-RNA".R/normalise.R, add short running example for normalise().R/visualise.R, add short running example for visualise().DESCRIPTION, description updated for CRAN, by removing some capital letters
and put --NACHO-- between single quotes.DESCRIPTION, title and description updated for CRAN.DESCRIPTION and vignetteDESCRIPTION, title and description updated for CRAN.summarise() imports and pre-process RCC files.normalise() allows to change settings used in summarise() and exclude outliers.visualise() allows customisation of the quality thresholds.summarise(), ssheet_csv can take a data.frame or a csv file.normalise() (and internal functions).visualise() replaces the Shiny app.summarise() and normalise() (and all internal functions).