The atomic vector constructors are equivalent to c()
but:
They allow you to be more explicit about the output type. Implicit coercions (e.g. from integer to logical) follow the rules described in vector-coercion.
They use dynamic dots.
lgl(...) int(...) dbl(...) cpl(...) chr(...) bytes(...)
... | Components of the new vector. Bare lists and explicitly spliced lists are spliced. |
---|
All the abbreviated constructors such as lgl()
will probably be
moved to the vctrs package at some point. This is why they are
marked as questioning.
Automatic splicing is soft-deprecated and will trigger a warning
in a future version. Please splice explicitly with !!!
.
# These constructors are like a typed version of c(): c(TRUE, FALSE) #> [1] TRUE FALSE lgl(TRUE, FALSE) #> [1] TRUE FALSE # They follow a restricted set of coercion rules: int(TRUE, FALSE, 20) #> [1] 1 0 20 # Lists can be spliced: dbl(10, !!! list(1, 2L), TRUE) #> [1] 10 1 2 1 # They splice names a bit differently than c(). The latter # automatically composes inner and outer names: c(a = c(A = 10), b = c(B = 20, C = 30)) #> a.A b.B b.C #> 10 20 30 # On the other hand, rlang's ctors use the inner names and issue a # warning to inform the user that the outer names are ignored: dbl(a = c(A = 10), b = c(B = 20, C = 30)) #> Warning: Outer names are only allowed for unnamed scalar atomic inputs #> A B C #> 10 20 30 dbl(a = c(1, 2)) #> Warning: Outer names are only allowed for unnamed scalar atomic inputs #> [1] 1 2 # As an exception, it is allowed to provide an outer name when the # inner vector is an unnamed scalar atomic: dbl(a = 1) #> a #> 1 # Spliced lists behave the same way: dbl(!!! list(a = 1)) #> a #> 1 dbl(!!! list(a = c(A = 1))) #> Warning: Outer names are only allowed for unnamed scalar atomic inputs #> A #> 1 # bytes() accepts integerish inputs bytes(1:10) #> [1] 01 02 03 04 05 06 07 08 09 0a bytes(0x01, 0xff, c(0x03, 0x05), list(10, 20, 30L)) #> [1] 01 ff 03 05 0a 14 1e