`as.cntrol.list.list()`

and hence`snctrl()`

no longer clobbers nested controls, e.g.,`control.ergm(SAN=control.san(...),...)`

.- To facilitate support for earlier versions of R, avoid using the
built-in pipe (
`|>`

) for now. - New linear algebra utilities:
`ginv_eigen()`

, which performs generalised inverse via eigendecomposition rather than SVD, to be used by`sginv()`

if`snnd=TRUE`

; and`xTAx_eigen()`

and`xTAx_seigen()`

to evaluate the inverse quadratic form using eigendecomposition. `lweighted.var()`

and`lweighted.cov()`

now take an additional argument`onerow=`

to specify what they should return (`NA`

, 0, or something else) if the input matrix has one row.- A new function
`var.mcmc.list()`

“method” to evaluate the covariance matrix for an`mcmc.list`

without constructing a large matrix. `colMeans.mcmc.list()`

“method” no longer constructs a large matrix when calculating.

- A new function,
`lweighted.cov()`

, to compute weighted covariance between two matrices or vectors. - New linear algebra utilities,
`is.SPD()`

,`sandwich_solve()`

,`sandwich_ssolve()`

,`sginv()`

,`snearPD()`

,`srcond()`

,`ssolve()`

,`xAxT()`

,`xTAx()`

,`xTAx_qrsolve()`

,`xTAx_qrssolve()`

,`xTAx_solve()`

, and`xTAx_ssolve()`

moved from`ergm`

and documented.

- In
`handle.controls()`

, arguments that are`match.arg()`

-ed are now evaluated in the correct frame.

- A helper function
`unused_dots_warning()`

is exported that works with`rlang::check_dots_used()`

to print an informative message.

- An S3 class
`term_list`

for storing terms extracted from a formula, by`list_rhs.formula()`

and others, containing information about each term’s sign and environment. Concatenation, indexing, and print methods are implemented.

`list_rhs.formula()`

can now handle`NULL`

terms on the RHS.

- An implementation of Welford’s online algorithm for calculating
sample mean and variance has been added as a class
`Welford`

that implements method`update()`

and maintains elements`$n`

,`$means`

,`$SSDs`

, and`$vars`

.

`snctrl()`

was issuing a warning twice when called with a misspelled argument.`deInf()`

now handles`NULL`

input.in

`locate_function()`

a subtle bug has been fixed in handling of visible as opposed to invisible objects.

`ergm`

’s term locator functions (`locate_function()`

and`locate_prefixed_function()`

) have been moved from`ergm`

.A new function,

`default_options()`

, a wrapper around`options()`

that drops options already set.A new function,

`as.control.list()`

generic and methods which take an R list and call an appropriate`control.*()`

function on it.`check.control.class()`

now first runs the control argument through`as.control.list()`

and overwrites, so`control=`

arguments to many functions can be plain lists.A new function,

`simplify_simple()`

, which takes a list and returns an atomic vector if the elements of the list are atomic and of length 1, with particular handling for`NULL`

and empty (0-length) elements.A new function,

`snctrl()`

(StatNet ConTRoL), designed so that argument completion will complete all available control functions. Looking up its help (`?snctrl`

) produces a dynamic list of all control parameters and their packages and control functions that is updated as packages are loaded and unloaded.A new function,

`handle.controls()`

, that performs the most normal functions in a`control.*()`

function.Two trivial helper functions,

`base_env()`

and`empty_env()`

, to replace an object’s environment with`baseenv()`

and`emptyenv()`

, respectively.A new function,

`fixed.pval()`

that wraps`base::format.pval()`

with better default arguments.A reimplementation of

`attr()`

is exported, which disables partial matching by default.

`statnetStartupMessage()`

now first looks for a`comment=(affil=...)`

for the contributor’s affiliation, before using e-mail.Improved output formatting for

`.Deprecate_once()`

.`append_rhs.formula()`

now accepts NULL as the first argument, in which case it creates a new formula, and takes an additonal argument`env=`

, which is used as this new formula’s environment.

`rle`

utilities are no longer reexported.`statnet.common`

no longer depends on`purrr`

.`statnetStartupMessage()`

has been simplified.

`rle`

utilities have been moved to a separate package, `rle`

- Major methods are reexported, for now.

`split()`

methods for matrices and arrays, to split them along a margin.`trim_env()`

, a generic that will replace an environment (possibly attached to another object) with a sub-environment containing only objects whose names are specified.A

`diff()`

method for control lists and a`print()`

method for the resulting differences.`deInf()`

, to replace`.deinf()`

in package`ergm`

.A

`compress()`

generic, a`compress()`

method for RLEs, and a`doNotCompress`

argument to`rep.rle()`

. Both`compact.rle()`

and the`doNotCompact`

argument to`rep.rle()`

are now deprecated.

Various optimizations have been made to RLEs.

`nonsimp_update.formula()`

now handles both one and two sided formulas; it also now copies all names except`...`

when`from.new = TRUE`

.

`str.rle()`

now works despite the overridden`length()`

method.

`EVL()`

, a family of functions like`NVL()`

, that treat any object of length 0 as`NULL`

.`once()`

, a`purrr`

-style adverb that wraps a function to only evaluate the first time it’s called with a given configuration of arguments.`persistEval()`

and`persistEvalQ()`

to retry evaluating a given expression a specified number of times.

- In
`forkTimeout()`

, don’t collect a process twice. Thanks to Tomas Kalibera for suggesting the fix.

`.Deprecate_once()`

calls`.Deprecated()`

, passing all its arguments through, but only the first time it’s called.`.Deprecate_method()`

calls`.Deprecated()`

, but only if a method has been called by name, i.e.,`METHOD.CLASS`

.`forkTimeout()`

evaluates an R expression with a hard time limit (except on Windows) by forking a process. Unlike`setTimeLimit()`

, it enforces the limit even on native code.`ult()`

is a convenience function that extracts or replaces elements of a list indexed from the end.

`statnet.common`

now depends on R >= 3.5 due to what appears to be a method dispatching bug in earlier versions.The package no longer Enhances

`coda`

.

`despace()`

removes whitespace from a string.Pseudo-methods

`colMeans.mcmc.list()`

,`sweep.mcmc.list()`

, and`lapply.mcmc.list()`

(migrated from the`ergm`

package).`filter_rhs.formula()`

selectively deletes terms in on the RHS of a formula.`eval_lhs.formula()`

extracts the LHS of the formula and evaluates it in the specified environment.`NVL2()`

and`NVL3()`

for flexible substitution of null values.`message_print()`

formats its arguments as if for`print()`

or`show()`

methods, but then prints to stderr like`message()`

.

`paste.and()`

now takes an additional`con=`

argument, allowing a conjunction other than “and” to be used.`ERRVL()`

now uses lazy evaluation and lets the user dot-substitute the previous argument’s try-error into the next argument.

Printing for control lists now works for function arguments.

A number of improvements to

`rle`

methods.

- A number of functions have been renamed for consistency:
`term.list.formula()`

→`list_rhs.formula()`

`append.rhs.formula()`

→`append_rhs.formula()`

`nonsimp.update.formula()`

→`nonsimp_update.formula()`

- Citation utilities have been deprecated, since CRAN’s structure makes them unusable.

The package now uses

`Roxygen`

for documentation.`term.list.formula()`

output format has been changed, since support of attributes on symbols is being deprecated.A library of methods has been added for the base

`rle`

class, implementing concatenation, compaction, and a number of binary operations.`all_same()`

has been moved from ergm and renamed to`all_identical()`

.A new assignment method

`NVL()<-`

overwrites a variable if its value is NULL.A set of classes and functions for manipulating and efficiently performing calculations on dense matrices or vectors with weighted rows or elements (possibly on the log scale) has been added.

New control parameter helper function, control.remap() has been added. Autodetection of function names by

`set.control.class()`

and`check.control.class()`

has been deprecated and now results in a warning.Improvements to the compressed data frame code, including an order() generic.

Miscellaneous robustifications added.

Native routine registration has been added.

`append.rhs.formula()`

,`vectors.namesmatch()`

,`term.list.formula()`

, and`ergm.update.formula()`

(renamed to`nosimp.update.formula()`

) moved from`ergm`

.Skye Bender-deMoll has been added as a contributor.

`ERRVL()`

moved from`ergm`

.Some

`NAMESPACE`

and other fixes to pass CRAN checks.

- control class improvements and bug fixes.

Updated e-mail address

Some improvements to opttest.

- Initial release, incorporating the control class framework
(
`set.control.class()`

,`check.control.class()`

,`print.control.list()`

); startup message framework;`NVL()`

;`sort.data.frame()`

;`compress.data.frame()`

;`paste.and()`

; citation utilities framework; and`opttest()`

framework.