I am starting to use vctrs
in a real project, and I am thankful for the added type and size stability.
In my use case, I would like to return vctrs::vec_size()
for vectors and otherwise return a sensible length without erroring out. I see 2 options:
- Just use
NROW()
. - Check
vec_is()
first and then decide whether to useNROW()
orvec_size()
.
(1) is risky if there are valid vectors for which NROW()
disagrees with vec_size()
, but I hesitate to adopt (2) because it is much slower than NROW()
.
library(bench)
library(vctrs)
f <- function(x) {
if (vec_is(x)) {
vec_size(x)
} else {
NROW(x)
}
}
x <- "abc"
mark(
NROW = NROW(x),
vec_size = vec_size(x),
custom = f(x)
)
#> # A tibble: 3 x 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 NROW 390ns 585ns 1555426. 0B 156.
#> 2 vec_size 363ns 507ns 1812045. 2.2KB 0
#> 3 custom 2.08µs 2.89µs 324205. 17.7KB 97.3
x <- new.env()
mark(
NROW = NROW(x),
custom = f(x)
)
#> # A tibble: 2 x 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 NROW 495ns 642ns 1484035. 0B 0
#> 2 custom 1.51µs 1.84µs 521306. 0B 0
Created on 2019-12-10 by the reprex package (v0.3.0)
Are there vectors for which NROW()
and vec_size()
disagree?