--- title: "Config files" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Config files} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#" ) ``` ## Purpose This vignette provides an overview of how to use a config file with the {aftables} package to set workbook properties and formatting. ## Workbook properties and formatting which can be set in a config file Workbook properties: - Author - Title - Keywords - Subject - Category - Comments Analysis Function guidance advises workbooks should have the author, title, keywords and language document properties completed. aftables provides functionality to set the author, title and keywords properties. See ['Releasing statistics in spreadsheets'](https://analysisfunction.civilservice.gov.uk/policy-store/releasing-statistics-in-spreadsheets/) for more information including how to set the workbook language. Workbook formatting: - Font name - Font sizes - Column widths ## Structure of a config file The config file must include an `aftables` entry. {aftables} will only look for workbook configs below the `aftables` entry. The config file may include any other entries. This means {aftables} settings can be added to an existing config file without conflicts. The `aftables` config file supports multiple entries. There must be at least one config below the `aftables` entry, which could be named `default` or be a user-specified custom config. Each config must contain at least one of `workbook_properties` and `workbook_format`. The value of each key below `workbook_properties` must be a character string apart from `keywords`, which is a character vector. The value of every key below `workbook_format` must be an integer apart from `base_font_name` which must be a character string. {aftables} checks all config keys to ensure they are character strings or integers as required to process them correctly. This is the contents of the example config file included with {aftables}: ```{r results='asis', echo = FALSE} cat("```xml\n") cat(readLines(system.file("ext-data", "config.yaml", package = "aftables")), sep = "\n") cat("\n```\n") ``` Values of keys below `workbook_properties` will appear in the Excel workbook when it is saved using wb_save from openxlsx2. They can be found in the file properties or the workbook information. Values of keys below `workbook_format` will be applied to the contents of the workbook. The values of `base_font_name` and `base_font_size` define the default font name and size used by the workbook. All text not formatted as a table header, sheet subheading or sheet heading will use the default settings. Font sizes of sheet headings, sheet subheadings, and table header rows will use the values of `sheet_heading_size`, `sheet_subheading_size` and `table_header_size` respectively, and they will additionally be formatted as bold. The values of `cellwidth_default`, `cellwidth_wider` and `nchar_break` are used to define column widths. The units of `cellwidth_default` and `cellwidth_wider` are the column width values used by Excel. All columns widths are set by default to use the `cellwidth_default` value. If the number of characters in a column header or the contents of a column exceeds the value of `nchar_break` aftables will set the column width to the value of `cellwidth_wider`. Users can avoid text wrapping in columns or column headers by setting the value of `nchar_break` based on their data or the content of their column headers. The `create_config_yaml()` function outputs a copy of this config file to a location of the users choice. The default location is the current working directory. We recommend using the example config file as a basis for developing your own {aftables} config file. ## Applying a config file with `generate_workbook()` The `generate_workbook()` function has two arguments for config files: `config_path` and `config_name`. Both arguments are optional, and {aftables} will take different action based on which arguments are provided. {aftables} will look for a config file using the `config_path` argument. By default {aftables} will look in the current working directory for a config file named `config.yaml`. `config_path` can be set to NULL and {aftables} will not look for a config file. {aftables} will only use the `config_name` argument if a config file is found. {aftables} config files must have an `aftables` entry containing one or more configs. These configs can be a `default` config and/or any user-specified custom configs. Users can set up multiple custom configs to produce multiple workbooks from a single config file. Settings common to all workbooks would be set in the `default` config, and settings specific to each workbook would be set in separate custom configs. The `default` config is optional, and custom configs can be used to specify all workbook properties and formatting. When a config file contains both a `default` config and a user-specified custom config matching the `custom_name` argument a combined config is generated from the `default` config and the `config_name` custom config. Values specified in the `config_name` custom config are preferred over the `default` config. ### Example 1: No config arguments in generate_workbook ```{r config example 1, eval = FALSE} my_wb <- generate_workbook(aftable = demo_aftable) ``` When the user does not provide any config arguments to {aftables} it will look in the working directory for a `config.yaml` file. If {aftables} finds a config file it will look for an `aftables` entry with a `default` config. If {aftables} cannot find a config file or the config file doesn't contain an `aftables` entry with a `default` config, it will generate an {openxlsx2} wbWorkbook object named `my_wb` without applying any config. Otherwise {aftables} will generate an {openxlsx2} wbWorkbook object named `my_wb` with the `default` config applied. This is the default behaviour of the {generate_workbook} function. ### Example 2: Using a custom config ```{r config example 2, eval = FALSE} my_wb <- generate_workbook( aftable = demo_aftable, config_name = "workbook1" ) ``` {aftables} will look in the working directory for a file named `config.yaml` and import the `aftables` entry. It will look for the `workbook1` config as well as a `default` config. If there is no `aftables` entry or `workbook1` config, {aftables} will stop with an error. If both the `default` and `workbook1` configs exist {aftables} will combine them, preferring values specified in the `config_name` custom config over those in the `default` config. If there is no `default` config all values will be taken from the `workbook1` config. {aftables} will generate an {openxlsx2} wbWorkbook object named `my_wb` with the `workbook1` or combined config applied. ### Example 3: Using a custom config file ```{r config example 3, eval = FALSE} dir.create("configs") create_config_yaml( path = "configs", open_config = FALSE ) my_wb <- generate_workbook( aftable = demo_aftable, config_path = "configs/config.yaml" ) ``` {aftables} will look for the user-specified config file from `config_path` and import the `aftables` entry. It will look for the `default` config. If there is no `aftables` entry or `default` config, {aftables} will stop with an error. Otherwise {aftables} will generate an {openxlsx2} wbWorkbook object named `my_wb` with the `default` config applied. ### Example 4: Using a custom config file with a custom config ```{r config example 4, eval = FALSE} dir.create("configs") create_config_yaml( path = "configs", open_config = FALSE ) my_wb <- generate_workbook( aftable = demo_aftable, config_path = "configs/config.yaml", config_name = "workbook1" ) ``` {aftables} will look for the user-specified config file from `config_path` and import the `aftables` entry. It will look for the `workbook1` config as well as a `default` config. If there is no `aftables` entry or `workbook1` config, {aftables} will stop with an error. If both the `default` and `workbook1` configs exist {aftables} will combine them, preferring values specified in the `config_name` custom config over those in the `default` config. If there is no `default` config all values will be taken from the `workbook1` config. {aftables} will generate an {openxlsx2} wbWorkbook object named `my_wb` with the `workbook1` or combined config applied.