Learn R Programming

vctrs

There are three main goals to the vctrs package, each described in a vignette:

  • To propose vec_size() and vec_ptype() as alternatives to length() and class(); vignette("type-size"). These definitions are paired with a framework for size-recycling and type-coercion. ptype should evoke the notion of a prototype, i.e. the original or typical form of something.

  • To define size- and type-stability as desirable function properties, use them to analyse existing base functions, and to propose better alternatives; vignette("stability"). This work has been particularly motivated by thinking about the ideal properties of c(), ifelse(), and rbind().

  • To provide a new vctr base class that makes it easy to create new S3 vectors; vignette("s3-vector"). vctrs provides methods for many base generics in terms of a few new vctrs generics, making implementation considerably simpler and more robust.

vctrs is a developer-focussed package. Understanding and extending vctrs requires some effort from developers, but should be invisible to most users. It’s our hope that having an underlying theory will mean that users can build up an accurate mental model without explicitly learning the theory. vctrs will typically be used by other packages, making it easy for them to provide new classes of S3 vectors that are supported throughout the tidyverse (and beyond). For that reason, vctrs has few dependencies.

Installation

Install vctrs from CRAN with:

install.packages("vctrs")

Alternatively, if you need the development version, install it with:

# install.packages("pak")
pak::pak("r-lib/vctrs")

Usage

library(vctrs)

# Sizes
str(vec_size_common(1, 1:10))
#>  int 10
str(vec_recycle_common(1, 1:10))
#> List of 2
#>  $ : num [1:10] 1 1 1 1 1 1 1 1 1 1
#>  $ : int [1:10] 1 2 3 4 5 6 7 8 9 10

# Prototypes
str(vec_ptype_common(FALSE, 1L, 2.5))
#>  num(0)
str(vec_cast_common(FALSE, 1L, 2.5))
#> List of 3
#>  $ : num 0
#>  $ : num 1
#>  $ : num 2.5

Motivation

The original motivation for vctrs comes from two separate but related problems. The first problem is that base::c() has rather undesirable behaviour when you mix different S3 vectors:

# combining factors makes integers
c(factor("a"), factor("b"))
#> [1] 1 1

# combining dates and date-times gives incorrect values; also, order matters
dt <- as.Date("2020-01-01")
dttm <- as.POSIXct(dt)

c(dt, dttm)
#> [1] "2020-01-01"    "4321940-06-07"
c(dttm, dt)
#> [1] "2019-12-31 19:00:00 EST" "1970-01-01 00:04:22 EST"

This behaviour arises because c() has dual purposes: as well as its primary duty of combining vectors, it has a secondary duty of stripping attributes. For example, ?POSIXct suggests that you should use c() if you want to reset the timezone.

The second problem is that dplyr::bind_rows() is not extensible by others. Currently, it handles arbitrary S3 classes using heuristics, but these often fail, and it feels like we really need to think through the problem in order to build a principled solution. This intersects with the need to cleanly support more types of data frame columns, including lists of data frames, data frames, and matrices.

Copy Link

Version

Install

install.packages('vctrs')

Monthly Downloads

1,771,059

Version

0.6.5

License

MIT + file LICENSE

Issues

Pull Requests

Stars

Forks

Maintainer

Last Published

December 1st, 2023

Functions in vctrs (0.6.5)

howto-faq-coercion

FAQ - How to implement ptype2 and cast methods?
faq-error-incompatible-attributes

FAQ - Error/Warning: Some attributes are incompatible
df_ptype2

Coercion between two data frames
faq-error-scalar-type

FAQ - Error: Input must be a vector
faq-compatibility-types

FAQ - How is the compatibility of vector types decided?
df_list

Collect columns for data frame construction
fields

Tools for accessing the fields of a record.
howto-faq-coercion-data-frame

FAQ - How to implement ptype2 and cast methods? (Data frames)
data_frame

Construct a data frame
as-is

AsIs S3 class
list_drop_empty

Drop empty elements from a list
howto-faq-fix-scalar-type-error

FAQ - Why isn't my class treated as a vector?
list_of

list_of S3 class for homogenous lists
maybe_lossy_cast

Lossy cast error
missing

Missing values
new_data_frame

Assemble attributes for data frame construction
name_spec

Name specifications
vec_ptype_full.integer64

64 bit integers
obj_is_list

List checks
new_factor

Factor/ordered factor S3 class
obj_print

print() and str() generics.
new_date

Date, date-time, and duration S3 classes
new_list_of

Create list_of subclass
new_partial

Partial type
new_vctr

vctr (vector) S3 class
new_rcrd

rcrd (record) S3 class
internal-faq-matches-algorithm

Internal FAQ - Implementation of vec_locate_matches()
internal-faq-ptype2-identity

Internal FAQ - vec_ptype2(), NULL, and unspecified vectors
%0%

Default value for empty vectors
order-radix

Order and sort vectors
reference-faq-compatibility

FAQ - Is my class compatible with vctrs?
partial_factor

Partially specify a factor
s3_register

Register a method for a suggested dependency
theory-faq-recycling

FAQ - How does recycling work in vctrs and the tidyverse?
theory-faq-coercion

FAQ - How does coercion work in vctrs?
unspecified

A 1d vector of unspecified type
vctrs-conditions

Custom conditions for vctrs package
runs

Runs
table

Table S3 class
vec-rep

Repeat a vector
vec_as_names

Retrieve and repair names
vctrs-package

vctrs: Vector Helpers
vec_as_location

Create a vector of locations
vec-set

Set operations
partial_frame

Partially specify columns of a data frame
vctrs-data-frame

vctrs methods for data frames
vec_as_index

Convert to an index vector
vec_as_names_legacy

Repair names with legacy method
vec_as_subscript

Convert to a base subscript type
vec_arith

Arithmetic operations
vec_count

Count unique values in a vector
vec_data

Extract underlying data
vec_bind

Combine many data frames into one data frame
vec_assert

Assert an argument has known prototype and/or size
vec_default_cast

Default cast and ptype2 methods
vec_compare

Compare two vectors
vec_init

Initialize a vector
vec_interleave

Interleave many vectors into one vector
vec_expand_grid

Create a data frame from all combinations of the inputs
vec_detect_complete

Complete
vec_cbind_frame_ptype

Frame prototype
vec_chop

Chopping
vec_duplicate

Find duplicated values
vec_cast

Cast a vector to a specified type
vec_equal

Equality
vec_c

Combine many vectors into one vector
vec_fill_missing

Fill in missing values with the previous or following value
vec_equal_na

Missing values
vec_group

Identify groups
vec_empty

Is a vector empty
vec_names

Get or set the names of a vector
vec_order

Order and sort vectors
vec_proxy_equal

Equality proxy
vec_math

Mathematical operations
vec_proxy_compare

Comparison and order proxy
vec_is_list

List checks
vec_proxy

Proxy and restore
vec_match

Find matching observations across vectors
vec_locate_matches

Locate observations matching specified conditions
vec_locate_sorted_groups

Locate sorted groups
vec_recycle

Vector recycling
vec_split

Split a vector into groups
vec_seq_along

Useful sequences
vec_repeat

Expand the length of a vector
vec_size

Number of observations
vec_slice

Get or set observations in a vector
vec_unique

Find and count unique values
vector-checks

Vector checks
vec_rank

Compute ranks
vec_ptype_full

Vector type as a string
vec_ptype

Find the prototype of a set of vectors
vec_ptype2.logical

Find the common type for a pair of vectors
vec_type

Deprecated type functions
vec_unchop

Chopping