Reverse dependency failures
32 reverse dependencies have live failures against the dev version of igraph. The full per-package analysis lives in revdep/problems-analysis.md. Grouped below by the underlying igraph change; each list tracks downstream PRs / issues.
Since #2834, each package's section is its own file — revdep/problems/<package>.md — and problems.md is their concatenation.
bfs(father = ) / dfs(father = ) defunct
The father argument was renamed to parent in igraph 2.2.0 and is now defunct; tidygraph passes it through to igraph::bfs() inside map_bfs* / map_dfs*, and the three packages below cascade through tidygraph.
tkplot() removed
The interactive Tk plotter advanced to deprecate_stop("3.0.0", "tkplot()"); affected packages are direct callers and need to switch to plot.igraph().
- Boptbd [📧 EMAIL SENT]
- c3net [📧 EMAIL SENT]
- ggm [📧 EMAIL SENT] ✅
- optbdmaeAT [📧 EMAIL SENT]
- optrcdmaeAT [📧 EMAIL SENT]
layout.spring() defunct
Defunct since igraph 2.1.0; replacement is layout_with_fr().
hub.score() defunct
Defunct since igraph 2.0.0; replacement is hits_scores()$hub.
get.edge() removed
The function has been removed; replacement is ends().
eigen_centrality(scale = FALSE) defunct
Defunct since igraph 2.1.1 — normalization is always performed; the argument needs to be dropped from the call.
sample_degseq(method = "simple.no.multiple") defunct
The method value was renamed to "fast.heur.simple" in igraph 2.1.0; qgraph calls it directly, degreenet hits it via a fallback inside reedmolloy()'s retry loop.
get_edge_ids() matrix-vp orientation defunct
Since igraph 2.1.5 the matrix form of vp must be n × 2, not 2 × n; transpose with t() or pass a 2-column data frame.
Deprecation warnings leaking into checks
Multiple deprecated igraph names still emit warnings; for these packages the warnings break check output (FrF2: leaks into .Rout.save comparison → NOTE; R6causal: leaks at install → WARNING). Pre-emptive rename needed before the names become defunct.
- FrF2 [📧 EMAIL SENT] ✅ (no longer failing as of 2026-08-05)
- R6causal [📧 EMAIL SENT] — still failing
create_ring(width = ) deprecated → strict no-warning test fails
migraph's and netrics' tutorial tests assert no warning; create_ring(32, width = 2) (defined in manynet, which migraph Depends on) emits a deprecation warning from somewhere inside its as_matrix() / graph_from_adjacency_matrix() chain. Upstream owner is manynet, not migraph.
- manynet (surfaces as a migraph test failure, and identically as a netrics one) [UNCLEAR]
Stricter integer validation in rewire_impl()
igraph's C interface now strictly rejects numeric values that are not exactly representable as integers; jewel computes niter = p * 0.05 (often fractional) and needs to integer-round before the rewire() call.
modularity() auto-uses "weight" edge attribute
modularity() now reads E(g)$weight by default when the attribute is present, changing computed values. Same class as the weights = NULL item below.
is_bipartite() stricter logical tests
The function is_bipartite() now checks if the type attribute is strictly logical or coercable to it
New in the 2026-08-05 revdep run
The 13 packages below appeared for the first time in the 2026-08-05 run. Unlike the groups above, most of these were ours — they trace to the ellipsis-move refactoring (#2757–#2778) and #2677, not to a lifecycle advancement.
Triaged in full since; current state below.
✅ Empty arguments in ... hard-errored — igraph regression, fixed
Since the optional arguments moved behind ..., an empty argument in the call (a trailing comma, or a skipped positional slot from a magrittr . placement) reached the runtime argument matcher and errored:
Error in igraph::graph_from_adjacency_matrix(adjmatrix = x, mode = mode, weighted = TRUE, ) :
argument is missing, with no default
Fixed by #2812, which removed the runtime matcher entirely and lets R match against the declared old signature. (#2808 was closed unmerged — this issue previously pointed at it.) A sweep of all 229 probeable generated blocks × 3 empty-slot shapes found no remaining divergence from 2.3.3.
- tna ✅ — verified green, 215 s, no errors either side
- lagdynamics ✅ — verified green (7 vignettes, 38 example blocks); not in the depth-1 revdep set, it reaches igraph through
tna
- modelbpp ✅ — verified green, 73 s
- NetSci ✅ — verified green, 35 s
One narrow case survived and is fixed separately in #2850: a named empty slot, as_adjacency_matrix(g, a = ), tripped the two guards that read argument names without looking at values.
🔵 weights = NULL auto-uses the weight edge attribute — intentional
as_adjacency_matrix() and friends read E(g)$weight when no weight argument is given, where the old attr default did not:
g <- make_ring(4); E(g)$weight <- c(0.5, 0.7, 0.2, 0.9)
as_adjacency_matrix(g) # dev: weights; CRAN 2.3.3: all 1s
This is deliberate (#906, #1137, #2677) — it brings these functions in line with distances() and the rest of igraph — and consistency wins over the revdep breakage. It was not announced; #2847 adds a breaking-change NEWS entry with migration guidance. The migration is an all-NA weights: weights = NA, rep(NA, ecount(g)) or numeric() all mean unweighted.
The family is wider than the adjacency functions: as_biadjacency_matrix()/as_incidence_matrix()/get.incidence() too, and power_centrality()/bonpow(), which had no weight argument at all before — for those it is a new default rather than a renamed one.
Downstream, needs notifying:
- sfclust — 11 test failures,
as_adjacency_matrix() vs a 0/1 reference matrix
- MetaNet —
within_module_deg_z_score() and part_coeff() call as_adj(g, sparse = FALSE) in their weighted = FALSE branch, so Zi/Pi land outside every role band and zp_analyse() errors with object 'role' not found
- SEMgraph —
buildLevels() round-trips as_adjacency_matrix() into graph_from_adjacency_matrix(mode = "directed"), which reads the weights as edge multiplicities; weights in (0,1) become zero edges, ecount drops 18 → 1, and SEMdag(LO = "TL") hits subscript out of bounds
as_adjacency_matrix(attr = NULL) was separately broken — the deprecation shim forwarded it to weights = NULL, inverting it — and is fixed by #2842. That cleared bnstruct.
🔵 graph_from_literal() preserves the formula's edge order — intentional
#824 / #1981 made graph_from_literal() return edges in the order the formula declares them, where they used to be re-sorted by endpoint:
as_edgelist(graph_from_literal(X -+ Z -+ Y, Y -+ X, X -+ Y))
# 2.3.3: X-Z X-Y Z-Y Y-X
# dev: X-Z Z-Y Y-X X-Y
#824 stays. Both packages below assign edge attributes positionally after building the graph, so the attributes land on different edges. Needs notifying:
- cfid —
import_graph() reads a 5×5 DAG where 4×4 is expected, and one edge comes back reversed; set_edge_attr(ig, "description", c(2, 4), "U") no longer marks the bidirected pair
- glyrepr —
E(graph)$linkage <- c(...) lands two -3 positions on the same vertex, so validate_glycan_graph() reports "Duplicated linkage positions"
#1981 also short-circuited simplify() itself, which changed the edge order for direct callers and suppressed edge.attr.comb. That part was not intended and is fixed by #2843, which clears:
- archeofrag ✅ —
sum(E(g)$weight) back to 64.95128999
- gemtc ✅ —
tree.relative.effect() signs match again
Both nonetheless have latent bugs of their own that our change exposed, and are being reported upstream: archeofrag's .euclidean.distance() mixes coordinate components across unrelated edges (returns 3.464102 3.464102 0 0 0 0 where the truth is 1 1 1 1 1 1, on CRAN igraph too), and gemtc's test uses is_equivalent_to(), which strips names and so pins an edge order rather than the result.
Note on ok in the revdep report
Before #2849, a package whose dependencies are not on CRAN was reported ok: R CMD check stopped at checking package dependencies in two or three seconds under both versions, the pair compared clean, and the verdict was "no new problems". 55 of run 31930350338's 984 ok results were that, SEMgraph among them — which is why its breakage above went unnoticed. Those are now reported depmissing.
A further 24 ok results are real checks of packages that are broken under CRAN igraph as well. ok means "no new problem", not "works".
Reverse dependency failures
32 reverse dependencies have live failures against the dev version of igraph. The full per-package analysis lives in
revdep/problems-analysis.md. Grouped below by the underlying igraph change; each list tracks downstream PRs / issues.Since #2834, each package's section is its own file —
revdep/problems/<package>.md— andproblems.mdis their concatenation.bfs(father = )/dfs(father = )defunctThe
fatherargument was renamed toparentin igraph 2.2.0 and is now defunct; tidygraph passes it through toigraph::bfs()insidemap_bfs*/map_dfs*, and the three packages below cascade through tidygraph.fatherparameter/field toparentin BFS/DFS calls thomasp85/tidygraph#208fatherparameter/field toparentin BFS/DFS calls thomasp85/tidygraph#208fatherparameter/field toparentin BFS/DFS calls thomasp85/tidygraph#208fatherparameter/field toparentin BFS/DFS calls thomasp85/tidygraph#208tkplot()removedThe interactive Tk plotter advanced to
deprecate_stop("3.0.0", "tkplot()"); affected packages are direct callers and need to switch toplot.igraph().layout.spring()defunctDefunct since igraph 2.1.0; replacement is
layout_with_fr().hub.score()defunctDefunct since igraph 2.0.0; replacement is
hits_scores()$hub.get.edge()removedThe function has been removed; replacement is
ends().eigen_centrality(scale = FALSE)defunctDefunct since igraph 2.1.1 — normalization is always performed; the argument needs to be dropped from the call.
sample_degseq(method = "simple.no.multiple")defunctThe method value was renamed to
"fast.heur.simple"in igraph 2.1.0; qgraph calls it directly, degreenet hits it via a fallback insidereedmolloy()'s retry loop.get_edge_ids()matrix-vporientation defunctSince igraph 2.1.5 the matrix form of
vpmust be n × 2, not 2 × n; transpose witht()or pass a 2-column data frame.Deprecation warnings leaking into checks
Multiple deprecated igraph names still emit warnings; for these packages the warnings break check output (FrF2: leaks into
.Rout.savecomparison → NOTE; R6causal: leaks at install → WARNING). Pre-emptive rename needed before the names become defunct.create_ring(width = )deprecated → strict no-warning test failsmigraph's and netrics' tutorial tests assert no warning;
create_ring(32, width = 2)(defined in manynet, which migraphDependson) emits a deprecation warning from somewhere inside itsas_matrix()/graph_from_adjacency_matrix()chain. Upstream owner is manynet, not migraph.Stricter integer validation in
rewire_impl()igraph's C interface now strictly rejects numeric values that are not exactly representable as integers; jewel computes
niter = p * 0.05(often fractional) and needs to integer-round before therewire()call.modularity()auto-uses"weight"edge attributemodularity()now readsE(g)$weightby default when the attribute is present, changing computed values. Same class as theweights = NULLitem below.is_bipartite()stricter logical testsThe function
is_bipartite()now checks if the type attribute is strictly logical or coercable to itNew in the 2026-08-05 revdep run
The 13 packages below appeared for the first time in the 2026-08-05 run. Unlike the groups above, most of these were ours — they trace to the ellipsis-move refactoring (#2757–#2778) and #2677, not to a lifecycle advancement.
Triaged in full since; current state below.
✅ Empty arguments in
...hard-errored — igraph regression, fixedSince the optional arguments moved behind
..., an empty argument in the call (a trailing comma, or a skipped positional slot from a magrittr.placement) reached the runtime argument matcher and errored:Fixed by #2812, which removed the runtime matcher entirely and lets R match against the declared old signature. (#2808 was closed unmerged — this issue previously pointed at it.) A sweep of all 229 probeable generated blocks × 3 empty-slot shapes found no remaining divergence from 2.3.3.
tnaOne narrow case survived and is fixed separately in #2850: a named empty slot,
as_adjacency_matrix(g, a = ), tripped the two guards that read argument names without looking at values.🔵
weights = NULLauto-uses theweightedge attribute — intentionalas_adjacency_matrix()and friends readE(g)$weightwhen no weight argument is given, where the oldattrdefault did not:This is deliberate (#906, #1137, #2677) — it brings these functions in line with
distances()and the rest of igraph — and consistency wins over the revdep breakage. It was not announced; #2847 adds a breaking-change NEWS entry with migration guidance. The migration is an all-NAweights:weights = NA,rep(NA, ecount(g))ornumeric()all mean unweighted.The family is wider than the adjacency functions:
as_biadjacency_matrix()/as_incidence_matrix()/get.incidence()too, andpower_centrality()/bonpow(), which had no weight argument at all before — for those it is a new default rather than a renamed one.Downstream, needs notifying:
as_adjacency_matrix()vs a 0/1 reference matrixwithin_module_deg_z_score()andpart_coeff()callas_adj(g, sparse = FALSE)in theirweighted = FALSEbranch, so Zi/Pi land outside every role band andzp_analyse()errors withobject 'role' not foundbuildLevels()round-tripsas_adjacency_matrix()intograph_from_adjacency_matrix(mode = "directed"), which reads the weights as edge multiplicities; weights in (0,1) become zero edges,ecountdrops 18 → 1, andSEMdag(LO = "TL")hitssubscript out of boundsas_adjacency_matrix(attr = NULL)was separately broken — the deprecation shim forwarded it toweights = NULL, inverting it — and is fixed by #2842. That cleared bnstruct.🔵
graph_from_literal()preserves the formula's edge order — intentional#824 / #1981 made
graph_from_literal()return edges in the order the formula declares them, where they used to be re-sorted by endpoint:#824 stays. Both packages below assign edge attributes positionally after building the graph, so the attributes land on different edges. Needs notifying:
import_graph()reads a 5×5 DAG where 4×4 is expected, and one edge comes back reversed;set_edge_attr(ig, "description", c(2, 4), "U")no longer marks the bidirected pairE(graph)$linkage <- c(...)lands two-3positions on the same vertex, sovalidate_glycan_graph()reports "Duplicated linkage positions"#1981 also short-circuited
simplify()itself, which changed the edge order for direct callers and suppressededge.attr.comb. That part was not intended and is fixed by #2843, which clears:sum(E(g)$weight)back to 64.95128999tree.relative.effect()signs match againBoth nonetheless have latent bugs of their own that our change exposed, and are being reported upstream: archeofrag's
.euclidean.distance()mixes coordinate components across unrelated edges (returns3.464102 3.464102 0 0 0 0where the truth is1 1 1 1 1 1, on CRAN igraph too), and gemtc's test usesis_equivalent_to(), which strips names and so pins an edge order rather than the result.Note on
okin the revdep reportBefore #2849, a package whose dependencies are not on CRAN was reported
ok:R CMD checkstopped atchecking package dependenciesin two or three seconds under both versions, the pair compared clean, and the verdict was "no new problems". 55 of run 31930350338's 984okresults were that, SEMgraph among them — which is why its breakage above went unnoticed. Those are now reporteddepmissing.A further 24
okresults are real checks of packages that are broken under CRAN igraph as well.okmeans "no new problem", not "works".