Partial function application allows you to modify a function by pre-filling some of the arguments. It is particularly useful in conjunction with functionals and other function operators.

Note that an argument can only be partialised once.

partial(.f, ..., .env = NULL, .lazy = NULL, .first = NULL)

Arguments

.f a function. For the output source to read well, this should be a named function. named arguments to .f that should be partially applied. Pass an empty ... =  argument to specify the position of future arguments relative to partialised ones. See rlang::call_modify() to learn more about this syntax. These dots support quasiquotation and quosures. If you unquote a value, it is evaluated only once at function creation time. Otherwise, it is evaluated each time the function is called. Soft-deprecated as of purrr 0.3.0. The environments are now captured via quosures. Soft-deprecated as of purrr 0.3.0. Please unquote the arguments that should be evaluated once at function creation time. Soft-deprecated as of purrr 0.3.0. Please pass an empty argument ... =  to specify the position of future arguments.

Examples

# Partial is designed to replace the use of anonymous functions for
# filling in function arguments. Instead of:
compact1 <- function(x) discard(x, is.null)

# we can write:
compact2 <- partial(discard, .p = is.null)

# partial() works fine with functions that do non-standard
# evaluation
my_long_variable <- 1:10
plot2 <- partial(plot, my_long_variable)
plot2()#> NULLplot2(runif(10), type = "l")#> NULL
# Note that you currently can't partialise arguments multiple times:
my_mean <- partial(mean, na.rm = TRUE)
my_mean <- partial(my_mean, na.rm = FALSE)
try(my_mean(1:10))#> Error in mean.default(na.rm = TRUE, ...) :
#>   formal argument "na.rm" matched by multiple actual arguments

# The evaluation of arguments normally occurs "lazily". Concretely,
# this means that arguments are repeatedly evaluated across invokations:
f <- partial(runif, n = rpois(1, 5))
f#> <partialised>
#> function (...)
#> runif(n = rpois(1, 5), ...)f()#> [1] 0.1538388 0.9316670 0.6664174 0.5214033 0.9335608f()#> [1] 0.39328750 0.67795588 0.80827452 0.52697525 0.11193650 0.95423720 0.02919632
# You can unquote an argument to fix it to a particular value.
# Unquoted arguments are evaluated only once when the function is created:
f <- partial(runif, n = !!rpois(1, 5))
f#> <partialised>
#> function (...)
#> runif(n = 3L, ...)f()#> [1] 0.2054296 0.8999639 0.7739089f()#> [1] 0.9676727 0.7804088 0.9705454

# By default, partialised arguments are passed before new ones:
my_list <- partial(list, 1, 2)
my_list("foo")#> [[1]]
#> [1] 1
#>
#> [[2]]
#> [1] 2
#>
#> [[3]]
#> [1] "foo"
#>
# Control the position of these arguments by passing an empty
# ... =  argument:
my_list <- partial(list, 1, ... = , 2)
my_list("foo")#> [[1]]
#> [1] 1
#>
#> [[2]]
#> [1] "foo"
#>
#> [[3]]
#> [1] 2
#>