R/auto_partial.R
automatic-partial-functions.Rd
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.
Functions supporting automatic partial application include:
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_auto()
, density_bounded()
and
density_unbounded()
.
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"))
The density
argument to stat_slabinterval()
works similarly with the
density_
family of functions.
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-is
density_auto()
#> <partial_function>:
#> density_auto()
# we could create a new function that uses half the default bandwidth
density_half_bw = density_auto(adjust = 0.5)
density_half_bw
#> <partial_function>:
#> density_auto(adjust = 0.5)
# we can overwrite partially-applied arguments
density_quarter_bw_trimmed = density_half_bw(adjust = 0.25, trim = TRUE)
density_quarter_bw_trimmed
#> <partial_function>:
#> density_auto(adjust = 0.25, trim = TRUE)
# when we eventually call the function and provide the required argument
# `x`, it is applied using the arguments we have "saved up" so far
density_quarter_bw_trimmed(x)
#>
#> Call:
#> density_auto(x = x, adjust = 0.25, trim = TRUE)
#>
#> Data: x (100 obs.); Bandwidth 'bw' = 0.08997
#>
#> x y
#> Min. :-2.3457 Min. :0.01034
#> 1st Qu.:-1.1220 1st Qu.:0.07434
#> Median : 0.1016 Median :0.15031
#> Mean : 0.1016 Mean :0.20417
#> 3rd Qu.: 1.3253 3rd Qu.:0.33709
#> Max. : 2.5490 Max. :0.66811