| Title: | Making "Deduplicated" Functions |
|---|---|
| Description: | Contains one main function deduped() which speeds up slow, vectorized functions by only performing computations on the unique values of the input and expanding the results at the end. |
| Authors: | Or Gadish [aut, cre, cph] |
| Maintainer: | Or Gadish <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 0.4.0 |
| Built: | 2026-06-03 07:28:37 UTC |
| Source: | https://github.com/orgadish/deduped |
Converts a vectorized function into one that only performs the computations on unique values in the first argument. The result is then expanded so that it is the same as if the computation was performed on all elements.
Note: This only works with functions that preserve length and order.
deduped(f)deduped(f)
f |
A length-preserving, order-preserving function that accepts a vector or list as its first input. |
Deduplicated version of f.
x <- sample(LETTERS, 10) x large_x <- sample(rep(x, 10)) length(large_x) slow_func <- function(x) { for (i in x) { Sys.sleep(0.001) } tolower(x) } system.time({ y1 <- slow_func(large_x) }) system.time({ y2 <- deduped(slow_func)(large_x) }) all(y1 == y2)x <- sample(LETTERS, 10) x large_x <- sample(rep(x, 10)) length(large_x) slow_func <- function(x) { for (i in x) { Sys.sleep(0.001) } tolower(x) } system.time({ y1 <- slow_func(large_x) }) system.time({ y2 <- deduped(slow_func)(large_x) }) all(y1 == y2)
DEPRECATED as of deduped 0.2.0.
Please use deduped(lapply)() or deduped(purrr::map)() instead.
deduped_map(.x, .f, ..., .progress = FALSE)deduped_map(.x, .f, ..., .progress = FALSE)
.x |
A list or atomic vector. |
.f |
A function, specified in one of the following ways:
Wrap a function with |
... |
Additional arguments passed on to the mapped function. We now generally recommend against using # Instead of x |> map(f, 1, 2, collapse = ",") # do: x |> map(\(x) f(x, 1, 2, collapse = ",")) This makes it easier to understand which arguments belong to which function and will tend to yield better error messages. |
.progress |
Whether to show a progress bar. Use |
A list whose length is the same as the length of the input,
matching the output of purrr::map().
This is a convenience wrapper for deduped() to allow it to be piped into
an expression. It will recursively parse the first arguments of the
expression call tree to find the bottom – when the first argument is not
itself a function call.
Without nesting: f(x, ...) |> with_deduped() is equivalent to
deduped(\(.z) f(.z, ...))(x).
With nesting: f(g(x, g2), f2) |> with_deduped() is equivalent to
deduped(\(.z) f(g(.z, g2), f2))(x).
with_deduped(expr, env = parent.frame())with_deduped(expr, env = parent.frame())
expr |
The expression to evaluate. |
env |
The environment within which to evaluate the expression. Can be modified when calling inside other functions. |
The result of evaluating the expression.
x <- sample(LETTERS, 10) x large_x <- sample(rep(x, 10)) length(large_x) slow_func <- function(x) { for (i in x) { Sys.sleep(0.001) } tolower(x) } system.time({ y1 <- slow_func(large_x) }) system.time({ y2 <- with_deduped(slow_func(large_x)) # Can also use the R pipe (R >= 4.1.0) or magrittr pipe, for convenience. # slow_func(large_x) |> with_deduped() }) all(y1 == y2)x <- sample(LETTERS, 10) x large_x <- sample(rep(x, 10)) length(large_x) slow_func <- function(x) { for (i in x) { Sys.sleep(0.001) } tolower(x) } system.time({ y1 <- slow_func(large_x) }) system.time({ y2 <- with_deduped(slow_func(large_x)) # Can also use the R pipe (R >= 4.1.0) or magrittr pipe, for convenience. # slow_func(large_x) |> with_deduped() }) all(y1 == y2)