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,
tidyr 1.0.0 (#9).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,
autoplot(), print() and
render() (#7).results = "asis").normalise() call with custom housekeeping genes
(-i.e.-, set housekeeping_predict = FALSE) (#10).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).