NEWS.md
generate_man() so that it no longer raises an error where no dyad census is given
n is a number of nodes rather than an existing network, man now defaults to c(0.25, 0.5, 0.25), the dyad distribution of a random digraph in which each arc is present with probability 0.5, so that generate_man(6) is now possible and returns the same distribution of networks as generate_random(6, 0.5, directed = TRUE)
generate_man(c(4,6)), where the dyad census is conditioned on the dyads between the modes; since ties in two-mode networks are undirected, mutual and asymmetric dyads are both realised as a tieman of the wrong length now reports what was expected and what was given, instead of the message for man not having been given at allman, which promised that a count such as c(10,0,20) would be treated as a count; such vectors are normalised into proportions, so the dyad census of an existing network is reproduced in expectation rather than exactlycollect_cran() so that it returns a scoped, correctly parsed network of package dependencies
dependencies, which selects the fields to collect and defaults to c("Depends", "Imports", "LinkingTo"), the dependencies that must be installed alongside a package, as in install.packages(); Suggests is no longer collected by default, since including it grows the dependency closure of manynet from 28 packages to 2348LinkingTo and Enhances can now be collected, where they were previously ignored altogethermax_dist and direction, so that dependencies can be collected to a given number of steps and in either direction, e.g. collect_cran("manynet", direction = "in", max_dist = 1) returns the packages that depend directly upon manynet
pkg now accepts a vector of package names, where more than one name previously raised a “the condition has length > 1” error, and names that are not on CRAN are now reported instead of silently returning an empty networkcollect_cran() raising a “trying to use CRAN without setting a mirror” error wherever no repository is set, as in non-interactive sessions, which had made it impossible to testversion, published, compiled, priority, license, and on_cran, the last of which distinguishes the several hundred dependencies, mostly Bioconductor packages, that are not themselves on CRAN; Compilation is renamed compiled and is no longer missing for every nodeto_uniplex(net, "Imports") scopes the network to one kind of dependencycollect_pkg() to use R’s own parser rather than regular expressions to find function definitions and calls
to_ego() previously had an in-degree of 10 in manynet’s own network, where it is in fact called nowhere=, defined as a \(x) lambda, or whose function keyword falls on a later line are now found, where only four hardcoded spacings of <- function were recognisedNAMESPACE, together with a generic nodal attribute, so that dispatch is represented and to_blocks(net, node_attribute(net, "generic")) collapses the network onto its genericsexternal, FALSE by default, so that calls to functions defined outside the directory are no longer included as nodes; namespaced calls are now qualified, so that e.g. igraph::V() cannot be confused with a locally defined V()
file, lines, exported, and generic, and ties are weighted by the number of call sitescollect_pkg() now reports through the usual console interface rather than base warning(), no longer raises a “number of items to replace is not a multiple of replacement length” error, and returns a network rather than a list where no functions are foundmake_cran to make_collect, and corrected it where it still described collect_cran() and collect_pkg() under their former names read_cran() and read_pkg()
create_cycle(n, directed = TRUE) to construct its cycle directed rather than relying on edgelist coercion to do soas_igraph() always returning a directed graph for edgelist or stocnet objects, discarding the network’s own directedness
is_acyclic() now returns FALSE and is_connected() returns TRUE for undirected networks through as_edgelist()
is_directed() already didinfo$directed for stocnet objectsto_component() so that it returns a single, chosen component, instead of being an alias of to_giant()
component selects the component to retain, by default 1, i.e. the largest (giant) component, with 2 the second largest, and so oncomponent may alternatively name a node, in which case the component containing that node is retained, e.g. to_component(fict_greys, "Miranda Bailey")
to_giant() is now a wrapper, such that to_giant(.data) is to_component(.data, component = 1), and is no longer genericto_components() to return its components ordered from largest to smallest, so that to_components(.data)[[n]] is to_component(.data, n); igraph::decompose() returns them in discovery orderconnectivity argument to to_component(), to_components(), and to_giant(), “weak” by default since a giant component is conventionally the weak one, and “strong” where ties must run in both directions between members
connectivity rather than igraph’s mode, which is reserved in this package for one- and two-mode networksto_giant(fict_starwars, connectivity = "strong") is a “Giant strong component of Star Wars network data”to_uniplex() erroring on networks it cannot reduce, and generalised where it looks for the tie types:
type == tie” error, and are now returned unchanged, as in to_waves() and to_slices()
to_uniplex(as_stocnet(ison_algebra), "tasks") now workstype column, so a tie attribute named “tie” no longer shadows the tie argumentto_ego() obtaining the neighbourhood of every node in the network before discarding all but one, which made it prohibitively slow on larger networksto_labelled()/to_named() on edgelists, which extracted the node columns with [, 1], so that a tibble edgelist raised a “‘list’ object cannot be coerced to type ‘double’” error
NA with as.numeric()
to_eulerian() as of limited value outside of producing one example of is_eulerian()
connectivity argument to is_connected(), so that weak connectivity can be tested directly rather than by calling to_undirected() first just to ask the question
is_labelled() and is_twomode() extracting edgelist columns with [, 1], returning a one-column tibble rather than a vector so that every labelled edgelist was reported as unlabelled and as two-modeis_attributed() returning TRUE for every network object because vertex.names and na, that class’s internal bookkeeping, were counted as substantive nodal attributesis_complex.stocnet() looking for from and to at the top level rather than in ties, which always returned FALSE
is_aperiodic() returning NA for networks with no cycles, such as directed acyclic graphs, where the greatest common divisor of an empty set of cycle lengths is undefined
actions/checkout@v7, actions/upload-artifact@v7, actions/download-artifact@v8), replacing some long-outdated @v2 pinsvignettes/articles/ from inst/tutorials/ and fails if the committed articles have drifted
data-raw/build_tutorial_articles.R is now tracked in the repository (it was previously excluded by .gitignore) so that the check can runcheck rather than the website dependenciesSuggests, since neither was used by the package or its tests
knitr::purl(), and no longer render the learnr tutorials (a fragile check that added no coverage beyond running the tutorial code itself)Config/Needs/website
.github/CONTRIBUTING.md so that it is available to all contributorsas_*list() family to expect NULL where a network or object class genuinely holds no such information, instead of reporting these as audit itemscreate_degree() so that it no longer raises an uninformative error where no degree sequence is given
outdegree nor indegree is given, the sparsest connected structure of that size is created: a cycle for one-mode networks, and for two-mode networks one in which the larger mode is 1-regular and the ties are spread as evenly as possible across the smaller modestopifnot() messagecreate_degree() returning two-mode networks with the modes reversed, e.g. create_degree(c(6,4)) returned a network with 4 nodes in the first mode and 6 in the secondcreate_cycle() and create_wheel() on two-mode networks so that, instead of raising an error where the requested number of nodes cannot form such a structure, the largest such structure is created and the surplus nodes are added as isolates, with a message explaining this
create_cycle(c(4,6)) now returns an 8-cycle and two isolatescreate_wheel(c(4,6)) now returns a wheel on 7 nodes and three isolatescreate_cycle() and create_wheel() are now also listed and described in the documentation for the defined structures, where they were previously only aliasedas_network() assigning the whole vector of a nodal attribute to every node where the network had just one such attribute, which also made the resulting object impossible to coerce backas_changelist(), as_globallist(), as_infolist(), and as_nodelist() methods for matrices and edgelists, which now return NULL instead of raising a “no applicable method” error, since these formats have nowhere to hold network-level information (matrices and edgelists do carry node labels, so as_nodelist() returns those where present)as_globallist.network(), so that a globallist stored on a network object by as_network() can be retrieved againas_network() dropping all tie attributes other than the weight, since networks were constructed from a sociomatrix; other tie attributes are now copied across dyad by dyad, so e.g. add_tie_attribute() on a network object now returns an object holding that attributeas_igraph.network() copying network’s internal vertex.names attribute across as an ordinary nodal attribute, which shadowed the node labels when coercing back to a network (e.g. adding nodes to a network returned an object with missing names), and copying the internal na attribute where it was not the first attributeis_twomode() on partially labelled matrices raising a “missing value where TRUE/FALSE needed” error, since comparing missing row and column names returned NA; such matrices are now treated as one-modeadd_ties() to accept several ways of declaring ties, so that what is documented is now what is possible:
add_ties(net, 3), adds that number of ties at random among the dyads not already tied (respecting directedness and two-modeness), which was previously documented but not implementedcreate_explicit(), e.g. add_ties(net, Betty -+ Tina), add_ties(net, 1 ++ 3), or add_ties(net, Betty:Sue -+ Tina), with several ties declared at once by wrapping them in c(), and one-sided formulae, e.g. ~ Betty -+ Tina, accepted for programmatic useadd_ties(net, c("Betty","Tina")), continues to work, as does ordinary arithmetic in the argument, since tie syntax requires + or - at both ends of the operatoradd_ties() on weighted networks giving the new ties a missing weight, which is not representable in matrix or network formats; they are now given a weight of 1 unless one is passed in attr_list
add_ties() and delete_ties() raising errors for network objects with a single nodal attribute (see the as_network() fix above)add_nodes() so that nodes added to a labelled network are labelled too, e.g. “N9” and “N10” where eight nodes were already named, since partially labelled networks are ambiguous for other functions and other classes (previously such networks raised a “missing value where TRUE/FALSE needed” error when coerced to a matrix or network object)bind_changes() on stocnet objects raising a “Can’t combine ..1$value ..2$value value column in a list but changelogs already on the object store value as an atomic vector; the two changelogs’ value columns are now reconciled before binding, falling back to a list-column (or to character) only where the values genuinely cannot be held in one vectorto_waves():
attribute when the network is not marked longitudinal, i.e. when the tie attribute is not called “wave” or “panel” (fixing the silent no-op behind stocnet/autograph#40)to_waves(cumulative = TRUE) no longer mangles single-wave results..1 ..2 to_waves(fict_starwars) now returns all seven waves rather than six) and each wave holds the ties of that wave (previously to_waves(fict_potter) returned an empty last wave)to_slices() erroring on networks it cannot slice:
time <= moments” error, and are now returned unchanged, as in to_waves()
weight != 0” error, since ties can only be dropped for summing to zero where they carry a weightto_time() to handle interval (spell) networks whose ties carry begin/end lifespans (e.g. irps_wwi): supplying a time returns the ties active at that moment (using the half-open begin <= time < end convention shared with network::networkDynamic), while omitting time returns a list of slices, one per change point (each moment at which some tie begins or ends). Previously to_time() reported such networks as unavailableto_time.igraph(), and time now defaults to missing so the slice-generating form can be called as to_time(net)
gloss() to return the requested term italicised where no glossary entry exists instead of raising an errorrevdep/ to .Rbuildignore so that reverse-dependency check artefacts are no longer bundled into the source tarball, resolving CRAN NOTEs about a non-standard top-level directory, an over-large tarball, and a stray CITATION fileas_matrix() on two-mode networks constructing the incidence matrix via structure() with the deprecated special names .Dim/.Dimnames, which now use dim/dimnames (resolving a CRAN NOTE)data-raw/cheatsheet/; Rscript data-raw/cheatsheet/build.R recompiles the PDF and one PNG per page and distributes them to inst/figures/, man/figures/, and the pkgdown sitetests/testthat/test-functional_*.R) that automatically enumerates exported functions by family prefix (to_*, from_*, is_*, net_*/node_*/tie_*, as_*list, create_*/generate_*/play_*, and the add_*/mutate_*/filter_*/etc. manipulation verbs) and audits each across a standard grid of fixture networks (directed, two-mode, weighted, signed, multiplex, longitudinal) and object classes (tidygraph, igraph, matrix, network, edgelist, stocnet), raising package test coverage from ~52% to over 70%
.data-first arguments, default methods, name-implied invariants such as !is_directed(to_undirected(x)), per-node/per-tie result lengths, and cross-class agreement)AUDIT [...] message rather than failed, marking where implementations still need workwrite_gml(), write_gdf(), and write_dynetml() as export counterparts to read_gml(), read_gdf(), and read_dynetml() (closes #148)
write_dynetml() records the network’s directedness in the isDirected attribute of the DyNetML <network> element, and read_dynetml() now respects it when reconstructing the graphwrite_gml() converts any logical graph/vertex/edge attributes to integer before export, avoiding igraph’s “boolean attribute was converted to numeric” warningread_gdf() dropping node attribute names when a GDF file defines only a single node attribute columnas_stocnet() and as_siena()
as_stocnet() now unpacks the full contents of a ‘sienadata’ object: multiple dependent networks (as tie layers), behavioural dependents and varying covariates (as nodal changes), constant covariates (as nodal attributes), constant and varying dyadic covariates (as tie layers), composition change (as nodal changes), and multiple node sets (as modes), preserving node labels and missing valuesas_siena.stocnet() reconstructs an equivalent ‘sienadata’ object, round-tripping values exactly (including covariate centering, which RSiena stores mean-centered)info slots to support this: focal (now a character vector naming all dependent variables), centered (a named logical vector of covariate centering), and siena (a sublist carrying RSiena-specific estimation metadata)as_siena() now routes any coercible object (igraph, tidygraph/mnet, matrix, network, …) through the ‘stocnet’ path via a single as_siena.default() method, so multiplex layers, waves, and covariates are carried across; longitudinal networks whose waves are held in a wave/time tie attribute now convert directlyas_siena() gives clearer errors: a helpful message when a network has fewer than two waves (e.g. as_siena(ison_adolescents)) or when a dependent network is valued/signed rather than binary (suggesting to_unweighted()), and passes categorical nodal attributes to SIENA as numeric-coded covariatesas_igraph()/as_tidygraph()/as_network() coercions of ‘sienadata’ objects, which previously did not dispatch because RSiena objects are classed sienadata rather than siena; these now route through the richer ‘stocnet’ pathas_nodelist.network() retaining a spurious all-FALSE na column, caused by testing a non-existent names field instead of the na column when deciding whether to drop itas_stocnet() warning about an unknown type column when coercing an igraph-like network that counts as multiplex only by virtue of carrying a non-reserved tie attribute; the type-to-layer renaming now only runs when a type column is presentdelete_node_attribute() and delete_tie_attribute(), the igraph-style counterparts to add_node_attribute()/add_tie_attribute(), so that attributes added the igraph way can also be removed that way (deletion via mutate_*(attr = NULL) remains the tidyverse-style route); each accepts a character vector to remove several attributes at onceapply_changes() emitting a spurious deprecation warning by calling the defunct collect_changes() internally instead of its replacement, gather_changes()
filter_changes() and select_changes() emitting a tidyselect deprecation warning by passing .by (and, for select_changes(), a spurious .by) as an external vector into a selection contextfilter_changes() to accept node labels as well as indices, so a changelog can be subset by name, e.g. filter_changes(fict_starwars, node == "Anakin")
select_ties() on ‘stocnet’ objects dropping the mandatory from/to columns when they are not among the selected columns; they are now always retained, as tidygraph does when selecting among edge attributescreate_motifs() to to_motifs(), since unlike the other create_*() functions it does not return a single network but a named list of small networks (one per motif), joining the to_*() functions (such as to_components() and to_subgraphs()) that return lists of networks
to_motifs() takes .data as its first argument, which accepts either a network (whose size, direction, and signedness are inferred) or a plain integer number of nodes, so that e.g. to_motifs(3) lists all three-node undirected motifs for teachingn argument to to_motifs(), so that either or both of .data and n may be given: passing only .data infers n from the network, passing only n builds motifs of that size directly, and passing both uses the network for the kind of motif while n selects the size (e.g. the dyadic, triadic, or tetradic motifs of an undirected network)signed argument to to_motifs(), enumerating the signed motifs of undirected networks for n=2 (+, -) and n=3 (the structural-balance triads +++, ++-, +--, --- and their incomplete forms)to_motifs(2, directed = TRUE, signed = TRUE)): the Holland-Leinhardt dyad census (Null, Asymmetric, Mutual) refined by arc sign into Asymmetric+/- and Mutual++/--/+-, documented alongside their correspondence to the dyadic reciprocity motifs of Gallo et al. (2025)bmotif dictionary IDs (Simmons et al. 2019), returned for two-mode input (which previously errored, caused by a length-two vector reaching a scalar if() size check)create_motifs() as an alias of to_motifs(), since it is relied upon by other stocnet packages (e.g. autograph)to_named() to to_labelled() and to_unnamed() to to_unlabelled() for consistency with is_labelled() and node_labels(); to_named() and to_unnamed() remain available as aliases since they are relied upon by other stocnet packagesto_wave() as an alias of to_time(), matching the wave-based vocabulary of net_waves() and to_waves() when extracting a single wave of a longitudinal networkto_component() as an alias of to_giant(), giving the “keep the one main component” verb a singular name that corresponds to the plural to_components() (which returns a list of all components), following the to_subgraph()/to_subgraphs() patternto_uniplex() throwing an error on unsigned multiplex networks (e.g. to_uniplex(irps_911, "trust")) due to an operator precedence bug in the check for dropping an all-positive/all-NA sign columnto_hypergraph() crashing the R session (“segfault from C stack overflow”) on directed networks, by converting to undirected before the maximal clique search; the crash is an upstream igraph 2.3.3 bug triggered when igraph::max_cliques() is called on a directed graph after igraph::any_multiple()
to_mode1() and to_mode2() to return one-mode networks unchanged, so projection is a no-op rather than an error when the network is already one-modefrom_waves() and from_slices() dropping isolates and node attributes when reassembling labelled networks, by binding the waves’/slices’ node tables as well as their tie tables (e.g. from_waves(to_waves(fict_potter)) now recovers all 64 nodes rather than only the 39 with ties)from_ties() warning “NAs introduced by coercion” when the merged networks record different DOIs; the first DOI is now kept (dates still keep the earliest)from_ties() on tidygraph objects reporting the first input’s tie-type metadata (e.g. “friendships”) from layer_names() instead of the newly created layers; the merged network now records its layers as tie-type metadatanode_names() to node_labels() for consistency with is_labelled() and to_labelled(); node_names() remains available as an alias since it is relied upon by other stocnet packagesnet_dims() to mode_nodes() for consistency with mode_names() and net_modes(); net_dims() remains available as an alias since it is relied upon by other stocnet packageslayer_ties(), reporting the number of ties in each layer of a multiplex network (in layer_names() order), mirroring how mode_nodes() reports nodes per modenet_waves(), an S3 generic reporting the number of waves/panels in a longitudinal network (closes #152), following the net_layers() pattern and consistent with is_longitudinal()’s wave/panel definitionprint()/describe_ties() reporting the total tie count for every layer (e.g. “1241 relationship ties and 1241 affiliation ties” for fict_marvel) instead of the per-layer counts (“558 relationship ties and 683 affiliation ties”)layer_names() returning nothing for multiplex networks that store their tie types only in a type tie attribute (e.g. ison_lawfirm, irps_911) rather than a graph-level attribute; it now falls back to the unique values of type when presentmode_names() returning nothing for two-mode ‘stocnet’ objects whose mode names are recorded only in the nodes table’s mode variable rather than in the info$modes metadata; it now falls back to the unique values of mode, mirroring layer_names()’s fallback to the layer tie variablemanynet1 and manynet2 (package-prefixed rather than numbered tutorial1a/tutorial1b, to avoid renumbering clashes with tutorials in sibling packages):
.callout style using a thin border and label text in the tutorial theme’s accent colour (manynet’s mustard yellow, #D6A929, sampled from the hex logo), rather than a filled background boxison_*), fictional (fict_*), or real-world (irps_*) networks, with curated per-flavour dataset menus and structural self-checks at each free-play exercise, and an optional “Going deeper” data-tidying section in the manipulating tutorial##) topics and cannot nest ### subsections; these scroll within the current topic via JavaScript rather than #anchor links, since learnr’s own router intercepts any hash navigation and resets to the first topic if the hash isn’t a registered topic idgloss() and a printed glossary at the end of each tutorialstocnet class and its anatomy (info/nodes/ties/changes/globals) before moving on to importing/exporting external datafict_marvel multiplex networkcreate_explicit() (with an undirected and a directed exercise), and describing collect_ego() for interactive ego-network collection (noted as console-only, since it cannot run inside the tutorial window)table_data() at render time, so they no longer go stale as datasets are addedread_nodelist() instead of read_edgelist()
tempdir() to avoid permission errors on installed packages[/[[/$ operators); Nodal properties (adding/removing nodes, labels, attributes); Tie properties (adding/removing ties, attributes, direction, weights, signs); Multiplex networks (joining, layers); Multimodal networks (modes); Dynamic networks (waves, changes); and a closing Selecting and cleaning section (subgraph filtering, isolates/giant/simplex) that narrows the fully built-up object down before the summary pipeline. The reformatting/transforming vocabulary is kept as a callout rather than the organising structure, and each element’s composition verbs (add_nodes()/delete_nodes(), add_ties()/delete_ties()) lead into that element’s own section
is_longitudinal()/is_dynamic()/is_changing(), net_waves(), to_time(), to_waves(), and the *_changes() family (filter_changes(), apply_changes()), previously untreated in the tutorials[/[[ operators section with $ get/set, and cross-referenced it as the do-it-yourself alternative alongside named functions throughout (e.g. net$name <- beside to_labelled())layer_names()/to_uniplex() (multiplex layers) and to_onemode()/to_twomode()/to_multilevel() (mode conversion) coverage alongside the existing two-mode projection materialsigned, longitudinal, and dynamic glossary entries to support the new sections’ hover-term definitionsas_igraph.stocnet() handled unlabelled two-mode networksto_hypergraph() for converting one-mode or two-mode networks to hypergraph representations (closed #145)
is_hypergraph() for identifying hypergraph representationsnode_attribute.network() and tie_attribute.network() for extracting node and tie attributes from ‘network’ objectsnet_node_missing() and net_tie_missing() for identifying missing nodes and ties in networks (closed #144)add_info() to ask for a focal layer if the network is multiplex and no layer is specifiedlayer_names() to be more robust to missing referencesadd_info()
add_info(.data) (so no further arguments) now checks to see whether metadata may be added and prompts the user to add it if soadd_info(.data, optional = TRUE) extends this to further, optional metadataexpect_nodes()/expect_ties() and introduces internal active-context helpersas_diffusion.igraph() to derive diffusion events from changelistsas_globallist() for extracting global variables from ‘igraph’ and ‘stocnet’ objectsas_stocnet.data.frame() for coercing edgelists to stocnet objects (closes #138)make_stocnet() construction, indexing, and validation of nodes, ties, changes, info, and globalsas_stocnet() coercion for data.frame and tbl_graph inputsmake_stocnet() aborts early and informatively when node labels do not match (thanks @auzaheta)add_tie_attribute()
bind_nodes() for adding nodes and ties from another networkarrange_changes() and arrange_nodes() as generics for reordering nodes and ties in a networkgather_changes() as a generic for gathering changes up to a time pointrename_changes() for renaming change variables and rename_globals() for renaming global variables
rename_*() methods to rename variables when no arguments givenselect_ties(), select_changes(), and select_globals() for selecting variables
select_*() methods to reorder variables when no arguments givenfilter_nodes(), filter_ties(), and filter_changes() as generics for filtering nodes, ties, and changes in a networksummarise_ties() for summarising tie variablesjoin_nodes.stocnet() for joining a nodelist to a stocnet objectarrange_ties(), bind_ties(), mutate_nodes(), mutate_ties(), and rename_nodes()
add_changes() to bind_changes.tbl_graph()
bind_changes.stocnet() for binding on groups of changes to a stocnet objectfrom_ties() to accept named arguments instead of a named list, improving consistency with other modifying functions
from_ties.stocnet() for creating a multiplex stocnet object from more than one network, including handling of tie types as layers and carrying forward nodal attributesstocnet objects so ties and changes remain alignedjoin_nodes() for joining two nodelistsmutate_globals() for mutating global variables in a networkto_*() default methods to coerce through supported graph classes and then restore original classesto_subgraph()
is_cognitive() for identifying cognitive social structure networksis_egonet() for identifying egocentric networksis_*() handling across stocnet, igraph, and tbl_graph inputsis_*() methods to return logical values reliably after coercionis_dynamic.stocnet() to look for more time-type variablesnet_nodes(), net_node_attributes(), and net_tie_attributes() coverage for table and network-like inputsnet_nodes.stocnet() and net_dims.stocnet() to work with unlabelled networks|>), the dplyr R dependence anywayrun_tute(), extract_tute(), and tutorial 0 to migraph
create_ego() to collect_ego() to better signal the different input structure expectedread_cran() and read_pkg() to collect_cran() and collect_pkg() for consistency with other collecting functionscreate_cycle() and create_wheel() (undirected by default)generate_permutation() as no longer necessaryplay_segregation() to be less verbosestocnet class for representing multilevel, multiplex, multimodal, signed, dynamic, or longitudinal networks as a structured list of tibbles and metadata
make_stocnet() for straightforward construction of stocnet objectsvalidate_stocnet() for checking and suggesting improvements to stocnet structureas_stocnet.igraph() for converting igraph objects to stocnet, including converting tie types to layersvalue class to hold and print values of different classes held in a list vectoras_matrix.igraph() for multiplex networksas_matrix.network() and as_igraph.network() bugs related to inheriting integer namesdiffnet coercion so that netdiffuseR is no longer requiredcollect_changes() to gather_changes()
add_info() so that if no further arguments are given it checks to see whether metadata may be added
add_info.stocnet() for adding metadata to stocnet objectsmutate_net() to mutate_info() for consistencynet_info() to as_infolist() for claritynetwork method for add_node_attribute()
join_nodes() to work with unlabelled networksto_ties.igraph() for unlabelled networksto_mode1() and to_mode2() to work with unlabelled networksto_no_missing() rlang data pronoun issueto_tree() to use updated igraph function namefrom_ties() to be quieter when joiningseq_nodes() and seq_ties() for indexing network elements, exported for use in other packagesnet_modes() and net_layers() for describing network structurenet_nodes.matrix() for extracting node count from matrix objectsnet_node_attributes() and net_tie_attributes() into generics with stocnet methodsnet_node_names() and net_tie_names() to mode_names() and layer_names() respectively for consistency with net_modes() and net_layers()
mode_names() and layer_names() to look for older grand-nested variable names where necessarynet_nodes(), net_dims(), net_ties(), net_name(), mode_names(), and layer_names()
network method for net_name()
is_egonet() to return correct value (FALSE) for non-netlistsis_signed() to no longer expect integersdiff_model method for is_changing()
is_manynet() now recognises the stocnet classstocnet methods for is_labelled(), is_signed(), is_complex(), is_multiplex(), is_changing(), is_longitudinal(), is_dynamic(), is_twomode(), and is_directed()
stopifnot(is.scalar(ties)) in generate_citations()
generate_citations() to be clear that it doesn’t yet work on two-mode networksdescribe_network() to include “network” as a suffixnet_attributes() for returning the names of graph attributesnet_info() for returning the list of graph attributesnet_waves() to now return waves = 1 for cross-sectional networksnode_is_isolate() to work with signed networksnode_is_pendant() to work with signed networksexpect_nodes() and expect_ties() for use in other packagesnet_name() for obtaining network name if availablenet_node_names() and net_tie_names() for network element informationwrite_graphml() to coerce to igraph firstto_mode1() and to_mode2() to carry forward nodal and tie attributes during projectionto_mode1() and to_mode2() to drop unnecessary nodal informationto_uniplex() to handle multimodal multiplex filtering correctly and retain tie type informationadd_changes() to work with tbl_graphfilter_nodes() to use dplyr::all_of()
interpolate() helper for injecting missing datanet_by_mixed() to work with multiplex networksprint_all()
delete_changes() for deleting all changes from a changing networkto_waves() to work with networks that are changing, longitudinal, or bothas_diffusion() to not trim off final wave in the reportas_diffusion() to return correct E and R compartments for waning diffusion modelsis_longitudinal() to only check for tie waves and not nodal changesnet_diversity() and node_diversity()
over_membership()
net_diversity() and node_diversity() to use and declare methods appropriate for the vector of attributesnet_homophily() and node_homophily() for measuring homophily according to different methods including
node_is_latent(), node_is_infected(), node_is_recoverd() to work with changing networksnode_is_exposed() to work with changing networks and now accepts a time argumentto_directed() and to_redirected() in the data tutorialgenerate_configuration() methods since igraph >= v2.1.0 requiredgenerate_configuration() to use recent versions of igraph::sample_degseq() correctlyread_gdf() for importing GDF filesjoin_nodes() not recognising nodelists correctlynode_randomwalk() closeness centralitynode_subgraph() centralityfict_actually to be a multiplex network (thanks @korakotbua)read_pkg() for creating a network of the function interdependencies within a packagenode_coreness() where data wasn’t recognised within pipesnet_by_hierarchy() for characterising networks by their graph theoretic dimensions of hierarchyison_emotions
irps_nuclear
describe_changes() to work with time as well as begin/end tie attributescreate_windmill()
create_wheel()
create_cycle()
to_uniplex() test so that it doesn’t rely on random samplingis_multiplex() to recognise more tie attributesto_no_missing() to record missing removalto_no_isolates() to record isolate removalto_giant() to record giant component scopingto_matching() to record matchingto_matching() triggering warnings from handling NAs (thanks @schochastics for fixing #109)to_mentoring() to record mentoringto_eulerian() to record Eulerian pathingnet_core() with method options for calculating correlation, distance, ndiff, and diffnode_coreness() to implement Borgatti and Everett’s continuous coreness algorithmnode_coreness() to node_kcoreness()
graphr(), graphs(), and grapht() to autograph
to_mode1() and to_mode2() to record projection changeto_no_missing() for removing nodes with missing dataas_diffusion.mnet() so that it includes “diff_model” classnode_richness() documentationtable_data() so that it lists components, longitudinal, dynamic, and changing datafict_lotr
irps_revere dataplay_learning()
play_diffusion() for e.g. SID modelscreate_ego()
snet_prompt() for easier to read consolessnet_minor_info() for reminding users to assign the functionto_matching() to work on the more general class of stable matching problems, including where nodes have different capacitiesprint.mnet() to print sections more prettily and accommodate changes when presentprint_all() for printing infinite rowsplay_diffusions() to migraph (but not play_diffusion())play_diffusion() to return an ‘mnet’ class object with changes instead of a ‘diff_model’ object with hidden network
old_version = TRUE
write_*() functions by printing picked pathnames to the consoleas_changelist() for extracting changelists from ‘mnet’ objectsas_diffusion.mnet() for maintaining backward compatibility for diffusion measuresas_tidygraph.networkDynamic() and as_igraph.networkDynamic() for coercing ‘networkDynamic’ objects into ‘mnet’, ‘tidygraph’, and ‘igraph’ objectsadd_changes() for adding changes to a network, including checks and imputing activity and susceptibilitymutate_changes() to mutate changesselect_changes() to select change variablesfilter_changes() to filter changescollect_changes() to collect changes up to a time pointapply_changes() to apply collected changes to a time pointto_time() for scoping a longitudinal network to a time point, including nodal and/or tie changesselect_nodes() for selecting only some nodal variablesmutate_net() for working with network informationis_changing() for identifying networks with a change componentnode_is_mean() for identifying typical nodesnode_is_*() diffusion marks to work with new .data outputnet_strength() for measuring the number of ties that would need to be removed from a network to increase its number of componentsnet_toughness() for measuring the number of nodes that would need to be removed from a network to increase its number of componentsover_*() to migraph
node_*() diffusion measures to work with new .data outputnet_modularity() by informing users when a bipartition is usednet_waves() for measuring the number of waves in a networknet_hazard() to net_by_hazard()
node_by_*() diffusion motifs to work with new .data outputfict_potter with composition changesison_starwars to fict_starwars, updating it with composition changes and additional codingirps_911 network data on 9/11 hijackers and associatesnode_in_community()
tie_is_bridge() and node_bridges()
to_waves() where result was unorderedgraphr() now uses categorical palettes (effectively closing #60)net_correlation() for calculating the product-moment correlation between networksis_aperiodic() where it would not work in tutorial chunkscreate_ego(), create_empty(), create_filled(), create_ring(), create_star(), create_lattice())as_matrix() handles signed networksas_nodelist() for extracting nodelists from networks into tibblesto_cosine()
to_galois() until it can be refactoredto_signed() for adding signs to networksto_weighted() for adding weights to networksgraphr() where line types were inferred incorrectlygraphr() so that layouts can now be snapped to a grid, mileage may varynode_is_pendant() for identifying pendant nodesnode_is_neighbor() for identifying adjacent nodestie_is_imbalanced() for identifying ties in imbalanced configurationssummary.network_measure() to return z-scores and p-values for measuresnode_vitality() for measuring closeness vitality centralitynode_eigenvector()
node_in_community() which runs through most salient community detection algorithms to find and return the one with the highest modularitynode_in_regular() to inform user which census is being usednode_by_quad() to node_by_tetrad() to be more consistent with Greek origins
summary.network_motif() which returns the z-scores for the motif scores based on random or configurational networks, traces progressplot.network_motif() where motif names were not identified correctly, internal make_network_motif now inherits call informationcluster_cosine() for another equivalence optionrun_tute() fuzzy matched so that insertions are not as costlygloss(), clear_glossary(), and print_glossary() for adding glossaries to tutorialsirps_wwi, a dynamic, signed networkison_blogs to irps_blogs, added infoison_books to irps_books, added infoison_usstates to irps_usgeo, added infoison_friends to fict_friends, added info and fixed directed issueison_greys to fict_greys, added infoison_lotr to fict_lotr, added infoison_thrones to fict_thrones, added info and some additional nodal attributesison_potter to fict_potter, added info and combined waves into single objectgraphr() where user not informed about concaveman dependencygraphr() examplesto_dominating() for extracting the dominating tree of a given networkgraphr() to make function more concise and consistent (thanks @henriquesposito)
node_eccentricity() to allow normalisation, appear in closeness documentationnode_stress() as a new betweenness-like centrality measurenode_leverage() as a new degree-like centrality measureread_*() now print the command used to the console if the (default) file.choose() is usedread_gml()
node_power()
options(manynet_verbosity ="quiet")
create_ego() for collecting ego networks through interviews, including arguments for:
create_motifs() for creating networks that correspond to the isomorphic subgraphs of certain size and formatprint.mnet()
add_info() for adding grand info to tidygraph objects
to_unweighted() so that it passes through unweighted networks correctlyset_manynet_theme() to set theme (re #60), but not yet fully implementedis_multiplex() to ignore “name” tie attributesnode_authority() and node_hub() centrality measuresnode_equivalency() for calculating four-cycle closure by nodenet_equivalency() to one-mode networkscreate_motifs()
node_by_dyad() for node level dyad censusnet_by_quad() for network level quad censusnode_by_quad() to avoid oaqc dependency (#89), more flexible but slowerprint.node_motif() to convert to tibble and add modes and names where available only upon print
suppressPackageStartupMessages()
stop() replaced by cli::cli_abort()
{grDevices} and png dependenciesrun_tute() and extract_tute() to look for installed packages and report progressread_cran() for creating networks of package dependencies on CRAN
generate_man() for generating dyad census conditional uniform graphsgenerate_islands() only takes a single integer and not a vectoras_tidygraph() to add an additional class ‘mnet’ that is used for prettier printing
make_mnet() (internally) for future-proofingprint.tbl_graph() renamed to print.mnet()
print.mnet() uses ‘grand’ data if availablebind_ties() to be more flexible about the input it accepts, converting all input into the required edgelistto_ego() for obtaining a single neighbourhooddelete_nodes() and delete_ties()
add_ties() and delete_ties() in documentationto_unnamed.igraph() when used with already unlabelled networkstie_is_path() for tracing the ties on a particular pathtie_is_triplet() for returning all the ties that are members of transitive tripletstie_is_forbidden() for identifying ties in forbidden triadstie_is_transitive() efficiency, now only retrieves the edgelist onceis_aperiodic() to remove minMSE dependency and offer a progress bar if it takes longer than 2 secondstie_is_triangular() to do with altpath namingnode_distance() for measuring the distance from or to particular nodesnode_degree() processed isolates in calculating strength in weighted networksison_ data with new as_tidygraph()
ison_adolescents as a testison_thrones on kinship arcs between Game of Thrones characters, with ‘grand’ dataison_monastery_ data into ison_monks, a single multiplex, signed, weighted, longitudinal networkcreate_degree() for creating networks of a given degree sequence, including k-regular graphsgenerate_citations() for citation modelsgenerate_fire() for forest-fire modelsgenerate_islands() for island modelscreate_explicit() now has its own documentationtie_is_triangular() for identifying ties in trianglestie_is_cyclical() for identifying ties in cyclestie_is_transitive() for identifying ties involved in transitive closuretie_is_simmelian() for identifying Simmelian tiesgenerate_permutation() renamed to to_permuted()
graphr() plots edges in directed networkstable_data() can now report on data from multiple packages
table_data() can now filter by any reported formats, such as ‘directed’ or ‘twomode’as_matrix.igraph() now only draws from the “weight” attribute and not, e.g. “type”to_blocks() related to categorical membership variablesmutate_ties()
node_names() now returns names of the form “N01” etc for unlabelled networksplot.matrix() works for unlabelled networksgraphr()
graphr()
graphr() functiongraphs() automatically uses “star” layout to plot ego networksgraphr(), graphs(), and grapht() also accept British spellingsgraphs() and grapht()
to_subgraphs() no longer sampled{minMse} dependencynetwork_* prefix to net_* for concisenesscreate_core() where the membership inferred when passing an existing network was incorrectgenerate_configuration() for generating configuration models (including for two-mode networks)play_diffusion() now includes an explicit contact argument to control the basis of exposurenode_is_*() functions now infer network data contextnode_is_independent() for identifying nodes among largest independent setsis_multiplex() now excludes reserved tie attribute names other than type, such as “weight”, “sign”, or “wave”is_attributed() to check for non-name nodal attributesnode_is_latent(), node_is_recovered(), and node_is_infected() (closes #71)is_twomode(), is_labelled(), and is_complex()
graphr(), graphs(), and grapht() (autographr(), autographs(), and autographd() are now deprecated)scale_size(range = c(...,...)) to be usedscale_size() from ggplot2
graphr() now rescales node size depending on network size (closes #51)to_named() now randomly generates and adds an alphabetic sequence of names, where previously this was just a random sample, which may assist pedagogical use
to_correlation() that implements pairwise correlation on networkarrange_ties() for dplyr-like reordering of ties based on some attributeto_correlation() for calculating the Pearson correlation
as_diff_model() where events were out of order and namedis_multiplex() now recognises “date”, “begin”, and “end” as reservednode_degree(), node_deg(), node_indegree(), node_outdegree(), node_multidegree(), node_posneg(), tie_degree(), net_degree(), net_indegree(), and net_outdegree()
node_betweenness(), node_induced(), node_flow(), tie_betweenness(), and net_betweenness()
node_closeness(), node_reach(), node_harmonic(), node_information(), tie_closeness(), net_closeness(), net_reach(), and net_harmonic()
node_eigenvector(), node_power(), node_alpha(), node_pagerank(), tie_eigenvector(), and net_eigenvector()
net_reciprocity(), node_reciprocity(), net_transitivity(), node_transitivity(), net_equivalency(), and net_congruency()
net_density(), net_components(), net_cohesion(),net_adhesion(), net_diameter(), net_length(), and net_independence()
net_transmissibility(), net_recovery(), net_reproduction(), net_immunity(), net_hazard(), net_infection_complete(), net_infection_total(), net_infection_peak(), node_adoption_time(), node_thresholds(), node_recovery(), and node_exposure()
net_richness(), node_richness(), net_diversity(), node_diversity(), net_heterophily(), node_heterophily(), net_assortativity(), and net_spatial()
net_reciprocity(), net_connectedness(), net_efficiency(), and net_upperbound()
node_bridges(), node_redundancy(), node_effsize(),node_efficiency(), node_constraint(), node_hierarchy(), node_eccentricity(), node_neighbours_degree(), and tie_cohesion()
net_core(), net_richclub(), net_factions(), node_partition(), net_modularity(), net_smallworld(), net_scalefree(), net_balance(), net_change(), and net_stability()
node_mode() (deprecated) to node_is_mode() since it returns a logical vectornode_attribute() and tie_attribute() to return measures when the output is numericnode_exposure() to work with two-mode and signed networksnode_constraint() to work with weighted two-mode networks, thanks to Toshitaka Izumi for spotting thismutate() without specifying .data
net_independence() for calculating the number of nodes in the largest independent setnode_coreness() now returns ‘node_measure’ outputnode_exposure() now sums tie weights where passed a weighted networknode_in_roulette() (previously node_roulette())node_in_optimal(), node_in_partition() (previously node_kernaghinlin()), node_in_infomap(), node_in_spinglass(), node_in_fluid(), node_in_louvain(), node_in_leiden(), node_in_betweenness(), node_in_greedy(), node_in_eigen(), and node_in_walktrap()
node_in_component(), node_in_weak(), and node_in_strong() (NB: node_in_component() is no longer phrased in the plural)node_is_core() and node_coreness()
node_in_adopter()
node_in_equivalence(), node_in_structural(), node_in_regular(), and node_in_automorphic()
node_*(), but including the preposition _in_ is more consistent.node_member class is now categorical
make_node_member() now converts numeric results to LETTER character resultsprint.node_member() now works with categorical membership vectorsprint.node_member() now declares how many groups before reporting the vectorsmutate() without specifying .data
node_by_tie(), node_by_triad(), node_by_quad(), node_by_path(), net_by_dyad(), net_by_triad(), net_by_mixed(), node_by_brokerage(), net_by_brokerage()
*_*_census(), but the preposition _by_ is more consistent.node_tie_census() now works on longitudinal network dataprint.node_motif() wasn’t printing the requested number of linescluster_hierarchical() and cluster_concor()
k_strict(), k_elbow(), and k_silhouette()
cluster_concor()
cluster_concor() now uses to_correlation() for initial correlationstats::cor() for subsequent iterationscluster_concor() handles unlabelled networkscluster_concor() handles two-mode networkscluster_concor() cutoff resulted in unsplit groupscluster_hierarchical() now also uses to_correlation()
ison_greys dataset, including some corrections to that published in {networkdata}
ison_friends dataset to be explicitly longitudinalison_usstates dataset with population data (Alaska and Hawaii missing)ison_southern_women dataset with surnames, titles, event dates, and corrected ties2024-03-13
autographr() examples that were taking too long to runautographr(), autographs(), and autographd() functionsautographr(), autographs(), and autographd() functionsnode_is_infected(), node_is_recovery(), node_is_latent() work for network lists2024-03-12
play_diffusions() to revert future plan on exitgenerate_random() works for two-mode networks with specified number of tiesautographr() more flexible and efficient in setting variables to aesthetics2023-12-24
run_tute()
2023-12-24
pkg_data() to report an overview of data contained within the package(s)play_diffusion() and play_diffusions() from migraph
play_learning() and play_segregation() from migraph
create_tree() where it was not returning a two-mode network correctlyas_diffusion() to coerce a table of diffusion events into diff_model class
as_*() functions are now considered modificationsmutate_nodes()
filter_nodes()
rename_nodes()
bind_ties()
delete_ties()
to_tree() to find one or more spanning trees amongst a network’s tiesfrom_ties() to collect multiple networks into a multiplex networkis.igraph() to is_igraph() for igraph v2.0.0is_list() for identifying a list of networksnode_is_core(), node_is_cutpoint(), node_is_fold(), node_is_isolate(), node_is_mentor() from migraph
node_is_exposed(), node_is_infected(), node_is_latent(), node_is_recovered() from migraph
node_is_max(), node_is_min(), node_is_random() from migraph
tie_is_bridge(), tie_is_loop(), tie_is_multiple(), tie_is_reciprocated() from migraph
tie_is_feedback()
tie_is_max(), tie_is_min() from migraph
tie_is_random()
scale_edge_color_centres(), scale_edge_color_ethz(), scale_edge_color_iheid(), scale_edge_color_rug(), scale_edge_color_sdgs()
autographr() now provides legends by default where multiple colours are used (closes #52)autographs() now labels legends correctly for binary variables (closes #38)autographs() now graphs just the first and last networks in a list (closes #45)autographs() now includes an option whether the layout should be based on the first, last, or both of two networks (closes #48)ison_konigsberg to ison_koenigsberg and named the bridgesison_algebra now in long multiplex formatison_karateka now weighted, anonymous members are named by number, and “obc” variable renamed “allegiance”ison_lawfirm enlarged from 36 to 71 nodes and now consists of three multiplex, directed networksison_southern_women names are now title caseison_hightech, a multiplex, directed network from Krackhardt 1987ison_monastery datasets, three of which are signed and weighted, and the other is longitudinal, from Sampson 1969 (closes #49)ison_potter datasets in a list of networks, from Bossaert and Meidert 2013 (closes #47)ison_usstates data on the contiguity of US states, from Meghanathan 20172023-12-17
to_waves.diff_model() now adds three logical vectors as variables, “Infected”, “Exposed”, and “Recovered”
node_is_latent(), node_is_infected(), and node_is_recovered()
autographr() now shapes seed, adopter, and non-adopter nodes using a parallel to migraph’s node_adoption_time() for
autographs() now colors susceptible, exposed, infected, and recovered nodes correctlyautographd() now colors susceptible, exposed, infected, and recovered nodes correctly2023-12-15
as_tidygraph() method for diff_model objectsas_siena() method for tidygraph objectsto_waves() now works on diff_model objects, add attributes and namesis_multiplex() now recognises a tie/edge ‘type’ attribute as evidence of multiplexityigraph::is_bipartite() is superseded by is_twomode()
tidygraph::activate() is superseded by mutate_ties() and similar functionsigraph::as_incidence_matrix() and igraph::graph_from_incidence_matrix() with igraph::as_biadjacency_matrix() and igraph::graph_from_biadjacency_matrix()
autographr() now plots diff_model objects, showing the diffusion as a heatmap on the verticesautographs() and autographd() now utilise network information in diff_model objects to provide better layouts (closed #17)node_size in autographd()
many_palettes replaces iheid_palette
theme_ethz(), scale_color_ethz()/scale_colour_ethz(), and scale_fill_ethz() for ETH Zürichtheme_uzh(), scale_color_uzh()/scale_colour_uzh(), and scale_fill_uzh() for Uni Zürichtheme_rug(), scale_color_rug()/scale_colour_rug(), and scale_fill_rug() for Uni Gröningen2023-12-06
read_graphml() and write_graphml() for importing and exporting graphml objects, mostly wrappers for igraph functions.autographd() and autographs() can now be used for plotting diffusion models.
to_waves() and autographd() to account for ‘exposed’ nodes in diffusion models.hierarchical layout so that node name can be specified for centering the layouttheme_heid() layout2023-11-15
+.ggplot() method for visualising multiple plots in the same panetheme_iheid for plotsscale_ family of functions for changing colour scales in plotsautographr():
autographd() function2023-11-01
as_igraph() in accordance with upcoming updates to igraph package (closing #27)2023-10-25
to_redirected.tbl_graph()
print.tbl_graph() no longer mentions the object class2023-10-19
run_tute() helper for quicker access to manynet and migraph tutorialsextract_tute() for extracting the main code examples from manynet and migraph tutorialspurl = FALSE to tutorial chunks that are not needed for extraction (thanks @JaelTan)run_tute() and extract_tute()
2023-10-11
autographr()
autographr(), closes #11autographr()
autographr() now automatically bends arcs for reciprocated ties when directed network is not too large/denseautographr() now accepts unquoted variables as argumentsautographr() now uses graphlayouts::layout_igraph_multilevel where appropriate2023-08-11
thisRequiresBio() helper function to download Bioconductor packagesison_konigsberg for illustrating Seven Bridges of Konigsbergison_brandes2 and added potential modal type as extra variable to ison_brandes
ison_bb, ison_bm, ison_mb, and ison_mm into a list of networks called ison_laterals
create_explicit() for creating networks based on explicit nodes and tiesdelete_nodes() for deleting specific nodesto_eulerian() function that returns a Eulerian path network, if available, from a given networkis_ functions from migraph
is_connected() to test if network is strongly connectedis_perfect_matching() to test if there is a matching for every node in the networkis_eulerian() to test whether there is a Eulerian path for a networkis_acyclic to test whether network is a directed acyclic graphis_aperiodic to test whether network is aperiodiclayout_tbl_graph_alluvial() that places successive layers horizontallylayout_tbl_graph_concentric()that places a “hierarchy” layout around a circlelayout_tbl_graph_hierarchy() that layers the nodes along the top and bottom sequenced to minimise overlaplayout_tbl_graph_ladder()that aligns nodes across successive layers horizontallylayout_tbl_graph_railway that aligns nodes across successive layers verticallytheme_iheid() function that themes graphs with colors based on the Geneva Graduate Institute2023-06-07
.data
print.tbl_graph method that offers easy to interpret informationread_*() functions, e.g. read_edgelist()
write_*() functions, e.g. write_edgelist()
write_matrix() for exporting to matricescreate_*() functions, e.g. create_lattice()
create_*() functions return tbl_graph class objectsgenerate_*() functions, e.g. generate_smallworld()
ison_* network data, e.g. ison_southern_women
as_*() functions, e.g. as_igraph()
as_edgelist.network()
as_network.data.frame()
as_network.tbl_graph()
join_*() functions, e.g. join_ties()
add_*() functions, e.g. add_node_attribute()
create_*() functions return tbl_graph class objectsmutate_*() functions, e.g. mutate_ties()
mutate_ties(), it is no longer necessary to activate(edges)
rename_*() functions, e.g. rename_ties()
is_*() functions, e.g. is_dynamic()
is_labelled() to work correctly with multiple network formatsto_*() functions, e.g. to_mode1()
to_giant.network()
to_directed() now a methodto_subgraphs() now returns a list of tbl_graphsto_reciprocated() now works on edgelists, matrices, tbl_graphs, and networksto_acylic() now works on matrices, tbl_graphs, and networksfrom_*() functions, e.g. from_egos()
from_subgraphs()
network_nodes()
network_dims() is now a method