config package for R
The config package makes it easy to manage environment specific configuration values. For example, you might want to use distinct values for development, testing, and production environments.
You can install the config package from CRAN as follows:
Configurations are defined using a YAML text file and are read by default from a file named config.yml in the current working directory (or parent directories if no config file is found in the initially specified directory).
Configuration files include default values as well as values for arbitrary other named configurations, for example:
default: trials: 5 dataset: "data-sampled.csv" production: trials: 30 dataset: "data.csv"
To read configuration values you call the
config::get function, which returns a list containing all of the values for the currently active configuration:
config <- config::get() config$trials config$dataset
You can also read a single value from the configuration as follows:
get function takes an optional
config argument which determines which configuration to read values from (the "default" configuration is used if none is specified).
Note that we purposely don't call
library(config) but rather qualify calls with the package name (e.g.
config::get()). This is to avoid conflicts between config functions and functions in the base R package (specifically,
You can specify which configuration is currently active by setting the
R_CONFIG_ACTIVE environment variable. The
R_CONFIG_ACTIVE variable is typically set within a site-wide
Rprofile (see R Startup for details on these files).
# set the active configuration globally via Renviron.site or Rprofile.site Sys.setenv(R_CONFIG_ACTIVE = "production") # read configuration value (will return 30 from the "production" config) config::get("trials")
You can check whether a particular configuration is active using the
Defaults and Inheritance
default configuration provides a set of values to use when no named configuration is active. Other configurations automatically inherit all
default values so need only define values specialized for that configuration. For example, in this configuration the
production configuration doesn't specify a value for
trials so it will be read from the
default: trials: 5 dataset: "data-sampled.csv" production: dataset: "data.csv"
All configurations automatically inherit from the "default" configuration. Configurations can also inherit from one or more other named configurations. For example, in this file the
production configuration inherits from the
default: trials: 5 dataset: "data-sampled.csv" test: trials: 30 dataset: "data-test.csv" production: inherits: test dataset: "data.csv"
By default configuration data is read from a file named config.yml within the current working directory (or parent directories if no config file is found in the initially specified directory).
You can use the
file argument of
config::get to read from an alternate location. For example:
config <- config::get(file = "conf/config.yml")
If you don't want to ever scan parent directories for configuration files then you can specify
use_parent = FALSE:
config <- config::get(file = "conf/config.yml", use_parent = FALSE)
You can execute R code within configuration files by prefacing values with
!expr. This could be useful in the case where you want to base configuration values on environment variables, R options, or even other config files. For example:
default: cores: 2 debug: true server: "localhost:5555" production: cores: !expr getOption("mc.cores") debug: !expr Sys.getenv("ENABLE_DEBUG") == "1" server: !expr config::get("server", file = "/etc/server-config.yml")