iv_proxy()is an S3 generic which allows you to write S3 methods for iv extension types to ensure that they are treated like iv objects. The input will be your iv extension object,x, and the return value should be an iv object.iv_restore()is an S3 generic that dispatches offtothat allows you to restore a proxied iv extension type back to its original type. The inputs will be a bare iv object,x, and your original iv extension object,to, and the return value should correspond toxrestored to the type ofto, if possible.
You typically don't need to create an iv_proxy() method if your class
directly extends iv through the class argument of new_iv(). You only
need to implement this if your class has a different structure than a
typical iv object. In particular, if vctrs::field(x, "start") and
vctrs::field(x, "end") don't return the start and end of the interval
vector respectively, then you probably need an iv_proxy() method.
You typically do need an iv_restore() method for custom iv extensions.
If your class is simple, then you can generally just call your constructor,
like new_my_iv(), to restore the class and any additional attributes that
might be required. If your class doesn't use new_iv(), then an
iv_restore() method is mandatory, as this is one of the ways that ivs
detects that your class is compatible with ivs.
This system allows you to use any iv_*() function on your iv extension
object without having to define S3 methods for all of them.
Note that the default method for iv_proxy() returns its input unchanged,
even if it isn't an iv. Each iv_*() function does separate checking to
ensure that the proxy is a valid iv, or implements an alternate behavior if
no proxy method is implemented. In contrast, iv_restore() will error if a
method for to isn't registered.
Arguments
- x
[vector]A vector.
- ...
These dots are for future extensions and must be empty.
- to
[vector]The original vector to restore to.
Value
iv_proxy()should return an iv object for further manipulation.iv_restore()should return an object of typeto, if possible. In some cases, it may be required to fall back to returning an iv object.
Examples
if (FALSE) {
# Registering S3 methods outside of a package doesn't always work quite
# right (like on the pkgdown site), so this code should only be run by a
# user reading the manual. If that is you, fear not! It should run just fine
# in your console.
library(vctrs)
new_nested_iv <- function(iv) {
fields <- list(iv = iv)
new_rcrd(fields, class = "nested_iv")
}
format.nested_iv <- function(x, ...) {
format(field(x, "iv"))
}
iv_proxy.nested_iv <- function(x, ...) {
field(x, "iv")
}
iv_restore.nested_iv <- function(x, to, ...) {
new_nested_iv(x)
}
iv <- new_iv(c(1, 5), c(2, 7))
x <- new_nested_iv(iv)
x
# Proxies, then accesses the `start` field
iv_start(x)
# Proxies, computes the complement to generate an iv,
# then restores to the original type
iv_set_complement(x)
}