compare | R Documentation |
This compares two R objects, identifying the key differences. It:
Orders the differences from most important to least important.
Displays the values of atomic vectors that are actually different.
Carefully uses colour to emphasise changes (while still being readable when colour isn't available).
Uses R code (not a text description) to show where differences arise.
Where possible, it compares elements by name, rather than by position.
Errs on the side of producing too much output, rather than too little.
compare()
is an alternative to all.equal()
.
compare(
x,
y,
...,
x_arg = "old",
y_arg = "new",
tolerance = NULL,
max_diffs = if (in_ci()) Inf else 10,
ignore_srcref = TRUE,
ignore_attr = "waldo_opts",
ignore_encoding = TRUE,
ignore_function_env = FALSE,
ignore_formula_env = FALSE,
list_as_map = FALSE,
quote_strings = TRUE
)
x , y |
Objects to compare. |
... |
A handful of other arguments are supported with a warning for backward comparability. These include:
All other arguments are ignored with a warning. |
x_arg , y_arg |
Name of |
tolerance |
If non- It uses the same algorithm as |
max_diffs |
Control the maximum number of differences shown. The
default shows 10 differences when run interactively and all differences
when run in CI. Set |
ignore_srcref |
Ignore differences in function |
ignore_attr |
Ignore differences in specified attributes?
Supply a character vector to ignore differences in named attributes.
By default the For backward compatibility with |
ignore_encoding |
Ignore string encoding? |
ignore_function_env , ignore_formula_env |
Ignore the environments of
functions and formulas, respectively? These are provided primarily for
backward compatibility with |
list_as_map |
Compare lists as if they are mappings between names and
values. Concretely, this drops |
quote_strings |
Should strings be surrounded by quotes? If |
A character vector with class "waldo_compare". If there are no differences it will have length 0; otherwise each element contains the description of a single difference.
There are two ways for an object (rather than the person calling compare()
or expect_equal()
to control how it is compared to other objects.
First, if the object has an S3 class, you can provide a compare_proxy()
method that provides an alternative representation of the object; this is
particularly useful if important data is stored outside of R, e.g. in
an external pointer.
Alternatively, you can attach an attribute called "waldo_opts"
to your
object. This should be a list of compare options, using the same names
and possible values as the arguments to this function. This option
is ignored by default (ignore_attr
) so that you can set the options in
the object that you control. (If you don't want to see the attributes
interactively, you could attach them in a compare_proxy()
method.)
Options supplied in this way also affect all the children. This means options are applied in the following order, from lowest to highest precedence:
Defaults from compare()
.
The waldo_opts
for the parents of x
.
The waldo_opts
for the parents of y
.
The waldo_opts
for x
.
The waldo_opts
for y
.
User-specified arguments to compare()
.
Use these techniques with care. If you accidentally cover up an important
difference you can create a confusing situation where x
and y
behave
differently but compare()
reports no differences in the underlying objects.
# Thanks to diffobj package comparison of atomic vectors shows differences
# with a little context
compare(letters, c("z", letters[-26]))
compare(c(1, 2, 3), c(1, 3))
compare(c(1, 2, 3), c(1, 3, 4, 5))
compare(c(1, 2, 3), c(1, 2, 5))
# More complex objects are traversed, stopping only when the types are
# different
compare(
list(x = list(y = list(structure(1, z = 2)))),
list(x = list(y = list(structure(1, z = "a"))))
)
# Where possible, recursive structures are compared by name
compare(iris, rev(iris))
compare(list(x = "x", y = "y"), list(y = "y", x = "x"))
# Otherwise they're compared by position
compare(list("x", "y"), list("x", "z"))
compare(list(x = "x", x = "y"), list(x = "x", y = "z"))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.