is_seq
(internal function in finp
): fixed
UB when length(table) == 0
.STRING_PTR
changed to STRING_PTR_RO
as
required by new CRAN policiesis_constant
does not inherit data.table
multithreadingand3s(rr == 0L)
works for raw rr
abs_diff
contains a which.max option = 3.f()
now
f(void)
)logical3
. When passes expression with non-numeric
components, no longer skips as if emptyabs_diff
for non-allocating versions of
abs(x - y)
.character2integer
for a faster version of
as.integer(gsub("[^0-9]", "", x))
Comma
, relatedly,
prettyNum(x, big.mark = ",")
coalesce0
as a convenience function, equivalent to
coalesce(x, 0)
for correct type of 0.diam
and thinner
for direct versions of
diff(minmax(x))
.every_int32
Returns a vector of every
integer
ModeC
most common element of integer vectors.unique_fmatch
and uniqueN_fmatch
for
distinct elements.and3s
and friends)
is now done using a different logic, and performs internal logical
operations on raw (char
) vectors.allNA
equivalent to all(is.na(x))
NA
results.minmax
accepts raw input, treating as unsigned
charactersLOGICAL
C API has been absorbed.Functions are now in C to improve install time and size.
Implies
for logical impliesdivisible2
test evenness of numbersfmatchp
, finp
experimental parallel
hashing functionsis_sorted
and isntSorted
for assertions
about sorted atomic vectorsminmax
multithreaded function of
c(min(x), max(x))
which_first
,
introduced in version 0.5.0, caused by an overeliance on compiler
optimization. (#20)pminV
no longer accept non-numeric inputdo_
functions have been removed entirelypmax0(x, in_place = TRUE)
now returns early, rather
than checking the vector twice.sum_isna
now reflects sum(is.na(x))
when x
contains NaN
.sum_isna
diverts ALTREP vectors to anyNA
for performance and to avoid problems when passed to C++.which_last
for the first index from the last
index.divisible
and divisible16
for returning
divisibilitycount_logical
fast tabulation of logical vectorsand3s
, or3s
, parallelized and
separated versions of &
sum_and3s
and sum_or3s
, the sums of the
above logical vectors.whichs
for an alternative implementation of
which
which separates the inputwhich_firstNA
and which_lastNA
for
first/last position of missing valueswhich_first
accepts argument use.which.max
for better performance on known short inputsis_constant
now accepts nThread
for
multithreaded checking of constant vectors and is much faster in general
even in single-thread mode.sum_isna
now accepts nThread
for
multithreaded accumulation of missing value countsare_even
can be slightly faster on integers if ignoring
NA
, handles large doubles (like 1e10
), and
accepts nThread
.is_safe2int(x)
now tolerates NaN
input.
Thanks to CRAN clang-UBSAN.which_first(x == y)
now works properly when
length(y) == length(x)
.xor2
a faster version of xor
.set.seed(1)
library(hutils)
library(hutilscpp)
<- function(...) {
bench__mark ::select(bench::mark(..., min_iterations = 12),
dplyr`itr/sec`, mem_alloc, n_gc)
expression, median,
}<- y <- logical(1e9)
x bench__mark(xor(x, y), xor2(x, y))
#> Warning: Some expressions had a GC in every iteration; so filtering is
#> disabled.
#> # A tibble: 2 x 5
#> expression median `itr/sec` mem_alloc n_gc
#> <chr> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 xor(x, y) 7.956s 0.126 14.901GB 16
#> 2 xor2(x, y) 1.652s 0.530 3.725GB 3
<- !y
x bench__mark(xor(x, y), xor2(x, y))
#> Warning: Some expressions had a GC in every iteration; so filtering is
#> disabled.
#> # A tibble: 2 x 5
#> expression median `itr/sec` mem_alloc n_gc
#> <chr> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 xor(x, y) 8.227s 0.121 14.901GB 13
#> 2 xor2(x, y) 1.983s 0.460 3.725GB 3
<- samp(c(TRUE, FALSE), 1e9)
x <- samp(c(TRUE, FALSE), 1e9)
y
bench__mark(xor(x, y), xor2(x, y))
#> # A tibble: 2 x 5
#> expression median `itr/sec` mem_alloc n_gc
#> <chr> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 xor(x, y) 20.276s 0.0493 14.901GB 11
#> 2 xor2(x, y) 1.971s 0.506 3.725GB 3
<- samp(c(TRUE, FALSE, NA), 1e9)
x <- samp(c(TRUE, FALSE), 1e9)
y
benc__mark(xor(x, y), xor2(x, y))
#> # A tibble: 2 x 5
#> expression median `itr/sec` mem_alloc n_gc
#> <chr> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 xor(x, y) 25.063s 0.0399 14.901GB 2
#> 2 xor2(x, y) 4.524s 0.221 3.725GB 3
Created on 2019-08-25 by the reprex package (v0.3.0)
NEWS.md
file to track changes to the
package.which_first(x == y)
now supports logical x
without returning arcane error messages.is_constant
, for testing atomic vectors and
isntConstant
for the first different valueis_sorted
and isntSorted
(currently
private), similarly.and3
, or3
for ternary and/or enabling
vectorized short-circuitingsum_isna
for counting NA
values.pminC
now handles integer inputs without coercing to
double.pmaxC(x, a)
accepts integer a
when
x
is type double.pmax0
and pmin0
perform much better,
especially when x
is known and marked as sorted, but also
due to a better algorithm using absolute value.set.seed(1)
attach(asNamespace("hutilscpp"))
#> The following object is masked from package:base:
#>
#> isFALSE
<- function(...) {
bench__mark ::select(bench::mark(..., min_iterations = 12),
dplyr`itr/sec`, mem_alloc, n_gc)
expression, median,
}<- rep_len(rlnorm(1e6, 7, 2), 1e9)
x bench__mark(do_pmaxC_dbl(x, 0), do_pmax0_abs_dbl(x))
#> # A tibble: 2 x 5
#> expression median `itr/sec` mem_alloc n_gc
#> <chr> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 do_pmaxC_dbl(x, 0) 2428.139ms 0.405 3618205.211KB 4
#> 2 do_pmax0_abs_dbl(x) 777.362ms 1.28 6.539KB 0
<- x - 1
x bench__mark(do_pmaxC_dbl(x, 0), do_pmax0_abs_dbl(x))
#> # A tibble: 2 x 5
#> expression median `itr/sec` mem_alloc n_gc
#> <chr> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 do_pmaxC_dbl(x, 0) 2.394s 0.410 3.451GB 4
#> 2 do_pmax0_abs_dbl(x) 2.590s 0.386 3.451GB 4
<- sort(x)
x bench__mark(do_pmaxC_dbl(x, 0), do_pmax0_radix_sorted_dbl(x))
#> # A tibble: 2 x 5
#> expression median `itr/sec` mem_alloc n_gc
#> <chr> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 do_pmaxC_dbl(x, 0) 3.593s 0.313 6.901GB 5
#> 2 do_pmax0_radix_sorted_dbl(x) 2.306s 0.437 3.451GB 4
<- rep_len(as.integer(rlnorm(1e6, 7, 2)), 1e9)
x bench__mark(do_pmaxC_int(x, 0L), do_pmax0_abs_int(x))
#> # A tibble: 2 x 5
#> expression median `itr/sec` mem_alloc n_gc
#> <chr> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 do_pmaxC_int(x, 0L) 2041.515ms 0.490 3906256.727KB 3
#> 2 do_pmax0_abs_int(x) 405.266ms 2.45 6.539KB 0
<- x - 1L
x bench__mark(do_pmaxC_int(x, 0L), do_pmax0_abs_int(x))
#> # A tibble: 2 x 5
#> expression median `itr/sec` mem_alloc n_gc
#> <chr> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 do_pmaxC_int(x, 0L) 1.449s 0.686 3.725GB 2
#> 2 do_pmax0_abs_int(x) 1.766s 0.577 3.725GB 1
<- sort(x)
x bench__mark(do_pmaxC_int(x, 0L), do_pmax0_radix_sorted_int(x))
#> # A tibble: 2 x 5
#> expression median `itr/sec` mem_alloc n_gc
#> <chr> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 do_pmaxC_int(x, 0L) 1.751s 0.568 7.451GB 2
#> 2 do_pmax0_radix_sorted_int(x) 1.404s 0.827 3.725GB 1
Created on 2019-08-10 by the reprex package (v0.3.0)