---
title: "Customize Your Diagrams"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Customize Your Diagrams}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
```
In this vignette we showcase the arguments of `flow_view()` and `flow_run()`
that affect the way the diagrams are displayed.
## `prefix`
`prefix` is used to display special comments on top of code blocks, it must start
with `"#"`.
```{r, eval = FALSE}
library(flow)
factorial <- function(x) {
## is the input valid ?
if(!is.integer(x) && length(x) == 1) {
## fail explicitly
stop("`x` must be integer!")
}
## initialize result
res <- 1
for(i in 2:x) {
## update result
res <- res * i
## is the result to big ?
if(res > 1000) {
## fail explicitly
stop("too big!!!")
}
}
res
}
flow_view(factorial, prefix = "##")
```
* `prefix` can be of length > 1 in which case all given prefixes are considered
* The unprefixed comments are ignored.
* Prefixed comments right before control flow calls (here `if`) will serve
as headers for control flow header blocks.
* Prefixed comments before other code will serve as headers for the subsequent
code chunks.
* Adding special comments in the middle of a code block code will split the block in two
* We need to use `{}` after `if (n == 0L)` if we want to use a prefixed comment
This argument is ignored when using the *plantuml* engine.
## `code`
`code` is used to choose whether to display the code in code blocks or only the
header, if `NA` the code will be displayed only if no header is defined by
special comments.
```{r, eval = FALSE}
flow_view(factorial, code = FALSE)
```
```{r, eval = FALSE}
flow_view(factorial, prefix = "##", code = FALSE)
```
```{r, eval = FALSE}
flow_view(factorial, prefix = "##", code = NA) # pay attention to the last block
```
This argument is ignored when using the *plantuml* engine.
## `narrow`
`narrow` is used to narrow makes sure the diagram stays centered on one column,
it will be longer but won't shift, which might be easier to display
on web pages for instance.
```{r, eval = FALSE}
kg_to_lb <- function(mass) {
if(mass < 0) {
stop("mass should not be negative!")
} else {
mass <- 2.20462262185 * mass
}
mass
}
flow_view(kg_to_lb)
```
```{r, eval = FALSE}
flow_view(kg_to_lb, narrow = TRUE)
```
This argument is ignored when using the *plantuml* engine.
## `truncate`
`truncate` is used to provide the maximum number of characters to be printed per
line, it works for code and headers.
```{r, eval = FALSE}
fun <- function() {
## short header
x <- "__________________________long string__________________________"
## __________________________long header__________________________
x
}
flow_view(fun, prefix = "##")
```
```{r, eval = FALSE}
flow_view(fun, truncate = 15, prefix = "##")
```
## `swap`
By default calls like `x <- if(cond) a else b` are automatically transformed into
`if(cond) x <- a else x <- b` so we can display the logic in a proper diagram.
If this is not acceptable this can be turned off by setting `swap` to `FALSE`.
```{r, eval = FALSE}
fun <- function(cond) {
x <- if(cond) this else that
x
}
flow_view(fun)
```
```{r, eval = FALSE}
flow_view(fun, swap = FALSE)
```