Learn R Programming

options

Simple, Consistent Package Options

If you've exposed options from a package before, you've inevitably re-written one or more pieces of trivial boilerplate code:

  • Prefixing option names with some sort of package namespace
  • Building your own option documentation
  • Preferentially using a default value, global options or environment variables
  • Parsing of environment variables into useful R data

options aims to make these things easy, without having to copy around boilerplate code.

Quick Start

Defining Options

Define your options using the define_options shorthand. Interlace descriptions and default values to define multiple options at once.

#' @import options
options::define_options(
  "This is an example of how a package author would document their internally
  used options. This option could make the package default to executing
  quietly.",
  quiet = TRUE,

  "Multiple options can be defined, providing default values if a global option
  or environment variable isn't set.",
  second_example = FALSE,

  "Default values are lazily evaluated, so you are free to use package functions
  without worrying about build-time evaluation order",
  lazy_example = fn_not_defined_until_later()
)

When you want more control, you can use define_option to declare all aspects of how your option behaves.

options::define_option(
  option = "concrete_example",
  default = TRUE,
  desc = paste0(
    "Or, if you prefer a more concrete constructor you can define each option ",
    "explicitly."
  ),
  option_name = "mypackage_concrete",   # define custom option names
  envvar_name = "MYPACKAGE_CONCRETE",   # and custom environment variable names
  envvar_fn = options::envvar_is_true() # and use helpers to handle envvar parsing
)

Documentation

As long as the options have been created as shown above, documenting your options is as easy as adding this small roxygen stub within your package.

#' @eval options::as_roxygen_docs()
NULL

Produces ?mypackage::options

mypackage Options

Description:

     Internally used, package-specific options. All options will
     prioritize R options() values, and fall back to environment
     variables if undefined. If neither the option nor the environment
     variable is set, a default value is used.

Options:

     quiet
          This is an example of how a package author would document their
          internally used options. This option could make the package default to
          executing quietly.

          default:

              TRUE

          option: mypackage.quiet

          envvar: R_MYPACKAGE_QUIET (raw)
...

When your options are used as default values to parameters, you can use the option documentation to populate your function parameter docs.

This is made simple when all of your parameters share the same names as your options.

#' @eval options::as_params()
#' @name options_params
#'
NULL

#' Count to Three
#'
#' @inheritParams option_params
#'
count_to_three <- function(quiet = opt("quiet")) {
  for (i in 1:3) if (!quiet) cat(i, "\n")
}

In situations where you have identically named parameters where you don't want to inherit the option documentation, you can provide their names to as_params to use just a subset of options. You can also reassign documentation for an option to a parameter of a different name.

#' Hello World!
#'
#' @eval options::as_params("silent" = "quiet")
#'
hello <- function(who, silent = opt("quiet")) {
  cat(paste0("Hello, ", who, "!"), "\n")
}

Customizing Behaviors

When using define_option you can set the option_name and envvar_name that will be used directly.

But it can be tedious and typo-prone to write these out for each and every option. Instead, you might consider providing a function that sets the default format for your option and environment variable names.

For this, you can use set_option_name_fn and set_envvar_name_fn, which each accept a function as an argument. This function accepts two arguments, a package name and internal option name, which it uses to produce and return the corresponding global option name or environment variable name.

options::set_option_name_fn(function(package, name) {
  tolower(paste0(package, ".", name))
})

options::set_envvar_name_fn(function(package, name) {
  gsub("[^A-Z0-9]", "_", toupper(paste0(package, "_", name)))
})

Copy Link

Version

Install

install.packages('options')

Monthly Downloads

817

Version

0.2.0

License

MIT + file LICENSE

Issues

Pull Requests

Stars

Forks

Maintainer

Last Published

May 12th, 2024

Functions in options (0.2.0)

naming

Define Naming Conventions
pkgname

Grab package name, at runtime
options_fmts

Optional Crayon Handling
envvar_fns

Generator functions for environment variable processors
defining_options

Defining Options
opt

Inspecting Option Values
option_spec

Specify Option
format.options_env

Format an options environment
reflow_option_desc

Reflow multiline strings
format.options_list

Format an options list
format_field

Format a possible option source
as_params

Produce @param roxygen sections for options
options_env

Options Environment Class
err

Raise a package error
assert_naming_fn_signature

Assert signature for naming functions
format.option_spec

Format an option specification
format_value

Format value shorthands for command line display
get_options_env

Retrieve options environment (experimental)
naming_formats

Naming Convention Formatters
as_roxygen_docs

Generate Standalone ?options Documentation