Alignment detection

Sometimes, you deliberately align code to make it more readable.

call(
  a =       3,
  b = 3213232
)

Until styler 1.1.1.9002 (with strict = TRUE, e.g. as in styler::style_file(..., strict = TRUE)), this was formatted as follows:

call(
  a = 3,
  b = 3213232
)

because no alignment detection was built in.1

styler >= 1.1.1.9003 detects aforementioned alignment for function calls. This vignette describes how aligned code is defined in styler and gives some examples so users can format their aligned code to match the definition styler uses to ensure their code is not unintentionally reformatted.

An important definition used in the remainder is the one of a column. All arguments of a function call that have the same position but are placed on different lines form a column. The below call shows a call with two columns and two rows. Columns separate arguments of the function call, so the separator is the comma. The first row is named because all arguments are named, the second is unnamed:

call(
  # column 1  | column 2 |
  abkj = f(2),         7,
  more_ = "a", 2 # more
)

Function calls

We generally distinguish the case of named and unnamed columns.

Non-technical

If all arguments in the first column are named: Make commas match position vertically and right align everything between commas

If not all arguments of the first column are named:2 Make all but the first column’s commas match position vertically and right align everything between the commas, except before the first comma on a line, give priority to correctly indent (i.e. left align).

By align everything in between the commas, we mean put zero space before a comma and at least one after. Note that the arguments on the first line are ignored when detecting alignment, which is best shown when code is formatted such that no line breaks will be modified by styler (which is the case if all names on the first line are unnamed and all subsequent are named), like here:

Examples

These typical examples match styler’s definition of alignment.

technical

Function calls are aligned if all of the following conditions hold (for all but the very first line (i.e. call( below):

# holds
call(
  a =  3,
  b = 32
)

# doesn't hold
call(
  a =  3,
   b = 32
)
# holds
call(
  a =  3, k  = 3,
  b = 32,    222
)

# doesn't hold
call(
  a =  3 ,
  b = 32
)
# holds
call(
  a =  ff("pk"), k  = 3, x =  2,
  b =     f(-g), 22 + 1, yy = 1,
  c =         1,
  f(x, y), 
  k
)

# doesn't hold
call(
  a =   3,
  b = 32, c = 2
)

Note that the above definition does not check alignment of =, so styler will treat the following as aligned:

rge(
  x  = 99, x =  2,
  fs =  1,  y = 1,
)

Comments

not supported yet.

Assignment

not supported yet.


  1. With strict = FALSE, the spacing would have been kept, however, strict = FALSE has a number of other implications because it is in general less invasive. For example, it would not add braces and line breaks to “if (TRUE) return()”.

  2. In the below example, the first argument of the first column is named (p = 2), the second argument of the first column is not (31)