---
title: "Get started"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Get started}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, echo = FALSE}
knitr::opts_chunk$set(echo = TRUE, comment = "")
knitr::knit_engines$set(list(
styler = function(options) {
options$comment <- ""
knitr::engine_output(
options,
c("# Before", options$code),
c("# After", styler::style_text(options$code))
)
}
))
options(styler.colored_print.vertical = FALSE)
styler::cache_deactivate()
```
# Entry-points
styler provides the following API to format code:
- `style_file()` styles `.qmd`, `.R`, `.Rmd`, `.Rmarkdown`, `.Rnw`, and `.Rprofile` files.
- `style_dir()` styles all these files in a directory.
- `style_pkg()` styles the source files of an R package.
- RStudio Addins for styling the active file, styling the current package and styling the highlighted selection, see `help("styler_addins")`.
Beyond that, styler can be used through other tools documented in the `vignette("third-party-integrations")`. Let's get started.
```{r}
library(styler)
```
### Passing arguments to the style guide
styler separates the abstract definition of a style guide from the application of it. That's why you must supply a style guide via `transformers` when styling (in case you don't want to rely on the defaults):
```{r}
style_text("a + b", transformers = tidyverse_style(scope = "indention"))
```
The styler API was designed so that you can pass arguments to the style guide via the styling function (e.g. `style_file()`) to allow more concise syntax:
```{r, results = 'hide'}
# equivalent
style_text("a + b", transformers = tidyverse_style(scope = "indention"))
style_text("a + b", scope = "indention")
```
The magic is possible thanks to `...`. See `style_text()` for details.
# Invasiveness
### `scope`: What to style?
This argument of `tidyverse_style()` determines the invasiveness of styling. The following levels for `scope` are available (in increasing order):
- "none": Performs no transformation at all.
- "spaces": Manipulates spacing between token on the same line.
- "indention": Manipulates the indention, i.e. number of spaces at the beginning of each line.
- "line_breaks": Manipulates line breaks between tokens.
- "tokens": manipulates tokens.
There are two ways to specify the scope of styling.
- As a string: In this case all less invasive scope levels are implied, e.g. `"line_breaks"` includes `"indention"`, `"spaces"`. This is brief and what most users need. This is supported in `styler >= 1.0.0`.
- As vector of class `AsIs`: Each level has to be listed explicitly by wrapping one ore more levels of the scope in `I()`. This offers more granular control at the expense of more verbosity. This is supported in `styler > 1.3.2`.
```{r}
# tokens and everything less invasive
style_text("a=2", scope = "tokens")
# just tokens and indention
style_text("a=2", scope = I(c("tokens", "indention")))
```
As you can see from the output, the assignment operator `=` is replaced with `<-` in both cases, but spacing remained unchanged in the second example.
### How `strict` do you want styler to be?
Another option that is helpful to determine the level of 'invasiveness' is `strict` (defaulting to `TRUE`). Some rules won't be applied so strictly with `strict = FALSE`, assuming you deliberately formatted things the way they are. Please see in `vignette("strict")`. For `styler >= 1.2` alignment in function calls is detected and preserved so you don't need `strict = FALSE`, e.g.
```{r}
style_text(
"tibble::tibble(
small = 2 ,
medium = 4,#comment without space
large = 6
)"
)
```
The details are in `vignette("detect-alignment")`.
# Ignoring certain lines
You can tell styler to ignore some lines if you want to keep current formatting. You can mark whole blocks or inline expressions with `styler: on` and `styler: off`:
```{r}
styler::style_text(
"
#> blocks
blibala= 3
# styler: off
I_have(good+reasons, to = turn_off,
styler
)
# styler: on
1+1
#> inline
ignore( this) # styler: off
f( ) # not ignored anymore
"
)
```
You can also use custom markers as described in `help("stylerignore", package = "styler")`. As described above and in `vignette("detect-alignment")`, some alignment is recognized and hence, *stylerignore* should not be necessary in that context.
# Caching
styler is rather slow, so leveraging a cache for styled code brings big speedups in many situations. Starting with version `1.3.0`, you can benefit from it. For people using styler interactively (e.g. in RStudio), typing `styler::cache_info()` and then confirming the creation of a permanent cache is sufficient. Please refer to `help("caching")` for more information. The cache is by default dependent on the version of styler which means if you upgrade, the cache will be re-built. Also, the cache takes literally 0 disk space because only the hash of styled code is stored.
# Dry mode
As of version `1.3.2`, styler has a dry mode which avoids writing output to the file(s) you want to format. The following options are available:
- *off* (default): Write back to the file if applying styling changes the input.
- *on*: Applies styling and returns the results without writing changes (if any) back to the file(s).
- *fail*: returns an error if the result of styling is not identical to the input.
In any case, you can use the (invisible) return value of `style_file()` and friends to learn how files were changed (or would have changed):
```{r, comment = "#>"}
out <- withr::with_tempfile(
"code.R",
{
writeLines("1+1", "code.R")
style_file("code.R", dry = "on")
}
)
out
```
# More configuration options
### Roxygen code example styling
This is enabled by default, you can turn it off with `include_roxygen_examples = FALSE`.
### Custom math token spacing
`styler` can identify and handle unary operators and other math tokens:
```{styler}
1++1-1-1/2
```
This is tidyverse style. However, styler offers very granular control for math token spacing. Assuming you like spacing around `+` and `-`, but not around `/` and `*` and `^`, do the following:
```{r}
style_text(
"1++1/2*2^2",
math_token_spacing = specify_math_token_spacing(zero = c("'/'", "'*'", "'^'"))
)
```
### Custom indention
If you, say, don't want comments starting with `###` to be indented and indention to be 4 instead of two spaces, you can formulate an unindention rule and set `indent_by` to 4:
```{r}
style_text(
c(
"a <- function() {",
"### not to be indented",
"# indent normally",
"33",
"}"
),
reindention = specify_reindention(regex_pattern = "###", indention = 0),
indent_by = 4
)
```
### Custom style guides
These were some (not all) configurations exposed in `style_file()` and friends as well as `tidyverse_style()`. If the above did not give you the flexibility you hoped for, your can create your own style guide and customize styler even further:
- either by removing rules from the tidyverse style guide as described in `vignette("remove_rules")`.
- or by creating your own style guide from scratch as described in `vignette("customizing_styler")`.