Several ggdist functions support automatic partial application: when called, if all of their required arguments have not been provided, the function returns a modified version of itself that uses the arguments passed to it so far as defaults. Technically speaking, these functions are essentially "Curried" with respect to their required arguments, but I think "automatic partial application" gets the idea across more clearly.
The point_interval() family, such as median_qi(), mean_qi(), mode_hdi(), etc.
The smooth_ family, such as smooth_bounded(), smooth_unbounded(), smooth_discrete(), and smooth_bar().
The density_ family, such as density_bounded(), density_unbounded() and density_histogram().
The align family.
The breaks family.
The bandwidth family.
The blur family.
Partial application makes it easier to supply custom parameters to these functions when using them inside other functions, such as geoms and stats. For example, smoothers for geom_dots() can be supplied in one of three ways:
as a suffix: geom_dots(smooth = "bounded")
as a function: geom_dots(smooth = smooth_bounded)
as a partially-applied function with options: geom_dots(smooth = smooth_bounded(kernel = "cosine"))
Many other common arguments for ggdist functions work similarly; e.g.
density, align, breaks, bandwidth, and point_interval arguments.
These function families (except point_interval()) also support passing waiver s to their optional arguments: if waiver() is passed to any of these arguments, their default value (or the most recently-partially-applied non-waiver value) is used instead.
Use the auto_partial() function to create new functions that support automatic partial application.
auto_partial(f, name =NULL, waivable =TRUE)
Arguments
f: A function
name: A character string giving the name of the function, to be used when printing.
waivable: logical: if TRUE, optional arguments that get passed a waiver() will keep their default value (or whatever non-waiver value has been most recently partially applied for that argument).
Returns
A modified version of f that will automatically be partially applied if all of its required arguments are not given.
Description
Several ggdist functions support automatic partial application: when called, if all of their required arguments have not been provided, the function returns a modified version of itself that uses the arguments passed to it so far as defaults. Technically speaking, these functions are essentially "Curried" with respect to their required arguments, but I think "automatic partial application" gets the idea across more clearly.
The point_interval() family, such as median_qi(), mean_qi(), mode_hdi(), etc.
The smooth_ family, such as smooth_bounded(), smooth_unbounded(), smooth_discrete(), and smooth_bar().
The density_ family, such as density_bounded(), density_unbounded() and density_histogram().
The align family.
The breaks family.
The bandwidth family.
The blur family.
Partial application makes it easier to supply custom parameters to these functions when using them inside other functions, such as geoms and stats. For example, smoothers for geom_dots() can be supplied in one of three ways:
as a suffix: geom_dots(smooth = "bounded")
as a function: geom_dots(smooth = smooth_bounded)
as a partially-applied function with options: geom_dots(smooth = smooth_bounded(kernel = "cosine"))
Many other common arguments for ggdist functions work similarly; e.g.
density, align, breaks, bandwidth, and point_interval arguments.
These function families (except point_interval()) also support passing waiver s to their optional arguments: if waiver() is passed to any of these arguments, their default value (or the most recently-partially-applied non-waiver value) is used instead.
Use the auto_partial() function to create new functions that support automatic partial application.
Examples
set.seed(1234)x = rnorm(100)# the first required argument, `x`, of the density_ family is the vector# to calculate a kernel density estimate from. If it is not provided, the# function is partially applied and returned as-isdensity_unbounded()# we could create a new function that uses half the default bandwidthdensity_half_bw = density_unbounded(adjust =0.5)density_half_bw
# we can overwrite partially-applied argumentsdensity_quarter_bw_trimmed = density_half_bw(adjust =0.25, trim =TRUE)density_quarter_bw_trimmed
# when we eventually call the function and provide the required argument# `x`, it is applied using the arguments we have "saved up" so fardensity_quarter_bw_trimmed(x)# create a custom automatically partially applied functionf = auto_partial(function(x, y, z =3)(x + y)* z)f()f(1)g = f(y =2)(z =4)g
g(1)# pass waiver() to optional arguments to use existing valuesf(z = waiver())(1,2)# uses default z = 3f(z =4)(z = waiver())(1,2)# uses z = 4