styler icon indicating copy to clipboard operation
styler copied to clipboard

Wrong indentation involving `~`?

Open gavinsimpson opened this issue 2 years ago • 7 comments

Is this the expected behaviour (with styler::tidyverse_style(scope = "indention"))?

txt <- '
m2 <- gam(list(max_temp ~ s(month, bs = "cc", k = 12) + s(year) +
                            ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
                        ~ s(month, bs = "cc", k = 12),
                        ~ s(month, bs = "cc", k = 12) + s(year)),
          method = "REML",
          data = month_maxima,
          family = gevlss(link = list("identity", "identity", "logit")),
          knots = knots,
          control = ctrl,
          optimizer = "efs")'
style_text(txt, scope = "indention", indent_by = 2)

output:


m2 <- gam(list(max_temp ~ s(month, bs = "cc", k = 12) + s(year) +
  ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
~ s(month, bs = "cc", k = 12),
~ s(month, bs = "cc", k = 12) + s(year)),
method = "REML",
data = month_maxima,
family = gevlss(link = list("identity", "identity", "logit")),
knots = knots,
control = ctrl,
optimizer = "efs")

I would have expected something like

m2 <- gam(list(max_temp ~ s(month, bs = "cc", k = 12) + s(year) +
    ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
    ~ s(month, bs = "cc", k = 12),
    ~ s(month, bs = "cc", k = 12) + s(year)),
  method = "REML",
  data = month_maxima,
  family = gevlss(link = list("identity", "identity", "logit")),
  knots = knots,
  control = ctrl,
  optimizer = "efs")

or (perhaps preferably - ideally?)

m2 <- gam(list(max_temp ~ s(month, bs = "cc", k = 12) + s(year) +
                          ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
                        ~ s(month, bs = "cc", k = 12),
                        ~ s(month, bs = "cc", k = 12) + s(year)),
  method = "REML",
  data = month_maxima,
  family = gevlss(link = list("identity", "identity", "logit")),
  knots = knots,
  control = ctrl,
  optimizer = "efs")

where the tildes are aligned with one another

If that's not the expected indentation, is there a way to stop the reindention associated with the ~? Assuming that's what is causing the failure to indent subsequent arguments 2 spaces as per the tidyverse style guide?

session info
─ Session info ────────────────────────────────────────────
 setting  value
 version  R version 4.2.1 (2022-06-23)
 os       Ubuntu 20.04.4 LTS
 system   x86_64, linux-gnu
 ui       X11
 language en_GB:en
 collate  en_GB.UTF-8
 ctype    en_GB.UTF-8
 tz       Europe/Copenhagen
 date     2022-07-29
 pandoc   2.18 @ /opt/quarto/bin/pandoc

─ Packages ──────────────────────────────────────────────── package * version date (UTC) lib source cli 3.3.0 2022-04-25 [1] RSPM (R 4.2.0) jsonlite 1.8.0 2022-02-22 [1] RSPM (R 4.2.0) rlang 1.0.4 2022-07-12 [1] RSPM (R 4.2.1) sessioninfo 1.2.2 2021-12-06 [1] RSPM (R 4.2.0)

[1] /home/au690221/R/x86_64-pc-linux-gnu-library/4.2 [2] /usr/local/lib/R/site-library [3] /usr/lib/R/site-library [4] /usr/lib/R/library

───────────────────────────────────────────────────────────

gavinsimpson avatar Jul 29 '22 12:07 gavinsimpson

Just to focus in on the ~ indentation. This illustrates the intended (?) behaviour with simpler code

txt <- '
f <- list(max_temp ~ s(month, bs = "cc", k = 12) + s(year) + ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
                   ~ s(month, bs = "cc", k = 12),
                   ~ s(month, bs = "cc", k = 12) + s(year))
'
style_text(txt, scope = "indention")

producing

f <- list(max_temp ~ s(month, bs = "cc", k = 12) + s(year) + ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
  ~ s(month, bs = "cc", k = 12),
  ~ s(month, bs = "cc", k = 12) + s(year))

but as soon as we break up the long first formula with a line break, the indentation breaks

txt <- '
f <- list(max_temp ~ s(month, bs = "cc", k = 12) + s(year) +
  ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
                   ~ s(month, bs = "cc", k = 12),
                   ~ s(month, bs = "cc", k = 12) + s(year))
'
style_text(txt, scope = "indention")

yielding

f <- list(max_temp ~ s(month, bs = "cc", k = 12) + s(year) +
  ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
~ s(month, bs = "cc", k = 12),
~ s(month, bs = "cc", k = 12) + s(year))

gavinsimpson avatar Jul 29 '22 13:07 gavinsimpson

Ok. Probably not intended but since most people don’t use a non-default scope value, it has not been detected…

lorenzwalthert avatar Jul 29 '22 20:07 lorenzwalthert

@lorenzwalthert Fair enough, but the first example I showed doesn't work as expected with the defaults either:

txt <- '
m2 <- gam(list(max_temp ~ s(month, bs = "cc", k = 12) + s(year) +
                            ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
                        ~ s(month, bs = "cc", k = 12),
                        ~ s(month, bs = "cc", k = 12) + s(year)),
          method = "REML",
          data = month_maxima,
          family = gevlss(link = list("identity", "identity", "logit")),
          knots = knots,
          control = ctrl,
          optimizer = "efs")'
style_text(txt, scope = "tokens")

yielding

m2 <- gam(list(
  max_temp ~ s(month, bs = "cc", k = 12) + s(year) +
    ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
  ~ s(month, bs = "cc", k = 12),
  ~ s(month, bs = "cc", k = 12) + s(year)
),
method = "REML",
data = month_maxima,
family = gevlss(link = list("identity", "identity", "logit")),
knots = knots,
control = ctrl,
optimizer = "efs"
)

gavinsimpson avatar Aug 01 '22 09:08 gavinsimpson

True, then let's fix that as well 😉

lorenzwalthert avatar Aug 01 '22 10:08 lorenzwalthert

Actually not related to ~, seems like only happens to unnamed arguments:

txt <- '
test_that(key(
                        s),
          x = 1)'
styler::style_text(txt, scope = "tokens")
#> 
#> test_that(key(
#>   s
#> ),
#> x = 1
#> )
txt <- 'test_that(key(
 1), 
1)'
styler::style_text(txt)
#> test_that(
#>   key(
#>     1
#>   ),
#>   1
#> )

Created on 2022-08-14 by the reprex package (v2.0.1)

lorenzwalthert avatar Aug 14 '22 17:08 lorenzwalthert

That's great; thanks!

gavinsimpson avatar Aug 25 '22 10:08 gavinsimpson

As you mentioned that the reported behaviour in the original issue was "probably not intended", I note that the reported behaviour remains in

> packageVersion("styler")                                                    
[1] ‘1.10.2.9000’

With

txt <- '
m2 <- gam(list(max_temp ~ s(month, bs = "cc", k = 12) + s(year) +
                            ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
                        ~ s(month, bs = "cc", k = 12),
                        ~ s(month, bs = "cc", k = 12) + s(year)),
          method = "REML",
          data = month_maxima,
          family = gevlss(link = list("identity", "identity", "logit")),
          knots = knots,
          control = ctrl,
          optimizer = "efs")'
style_text(txt, scope = "indention", indent_by = 2)

I'm still seeing

m2 <- gam(list(max_temp ~ s(month, bs = "cc", k = 12) + s(year) +
  ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
~ s(month, bs = "cc", k = 12),
~ s(month, bs = "cc", k = 12) + s(year)),
method = "REML",
data = month_maxima,
family = gevlss(link = list("identity", "identity", "logit")),
knots = knots,
control = ctrl,
optimizer = "efs")

whereas with scope = "tokens" what I think is the desirable formatting is achieved:

m2 <- gam(
  list(
    max_temp ~ s(month, bs = "cc", k = 12) + s(year) +
      ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
    ~ s(month, bs = "cc", k = 12),
    ~ s(month, bs = "cc", k = 12) + s(year)
  ),
  method = "REML",
  data = month_maxima,
  family = gevlss(link = list("identity", "identity", "logit")),
  knots = knots,
  control = ctrl,
  optimizer = "efs"
)

The simpler version I mentioned also doesn't indent nicely with scope = "indentation":

txt <- '
f <- list(max_temp ~ s(month, bs = "cc", k = 12) + s(year) +
  ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
                   ~ s(month, bs = "cc", k = 12),
                   ~ s(month, bs = "cc", k = 12) + s(year))
'
style_text(txt, scope = "indention")

yields

f <- list(max_temp ~ s(month, bs = "cc", k = 12) + s(year) +
  ti(month, year, bs = c("cc", "cr"), k = c(12, 10)),
~ s(month, bs = "cc", k = 12),
~ s(month, bs = "cc", k = 12) + s(year))
session info:

Output from sessioninfo::session_info()

─ Session info ──────────────────────────────────────────────────────────────────────────────────────
setting  value
version  R version 4.3.2 (2023-10-31)
os       Ubuntu 20.04.6 LTS
system   x86_64, linux-gnu
ui       X11
language en_GB:en
collate  en_GB.UTF-8
ctype    en_GB.UTF-8
tz       Europe/Copenhagen
date     2024-02-07
pandoc   2.5 @ /usr/bin/ (via rmarkdown)

─ Packages ──────────────────────────────────────────────────────────────────────────────────────────
!  package      * version     date (UTC) lib source
  abind          1.4-5       2016-07-21 [1] RSPM (R 4.3.0)
  ADGofTest      0.3         2011-12-28 [1] RSPM (R 4.3.0)
  boot           1.3-28.1    2022-11-22 [1] RSPM (R 4.3.0)
  brio           1.1.4       2023-12-10 [1] RSPM (R 4.3.2)
  bslib          0.6.1       2023-11-28 [1] RSPM (R 4.3.2)
  cachem         1.0.8       2023-05-01 [1] RSPM (R 4.3.0)
  callr          3.7.3       2022-11-02 [1] RSPM (R 4.3.0)
  class          7.3-22      2023-05-03 [1] RSPM (R 4.3.0)
  classInt       0.4-10      2023-09-05 [1] RSPM (R 4.3.1)
  cli            3.6.2       2023-12-11 [1] RSPM (R 4.3.2)
  clipr          0.8.0       2022-02-22 [1] RSPM (R 4.3.0)
  colorspace     2.1-0       2023-01-23 [1] RSPM (R 4.3.0)
  copula         1.1-3       2023-12-07 [1] RSPM (R 4.3.2)
  crayon         1.5.2       2022-09-29 [1] RSPM (R 4.3.0)
  curl           5.2.0       2023-12-08 [1] RSPM (R 4.3.2)
  DBI            1.2.1       2024-01-12 [1] RSPM (R 4.3.2)
  desc           1.4.3       2023-12-10 [1] RSPM (R 4.3.2)
  devtools     * 2.4.5       2022-10-11 [1] RSPM (R 4.3.1)
  diffviewer     0.1.1       2021-09-30 [1] RSPM (R 4.3.0)
  digest         0.6.34      2024-01-11 [1] RSPM (R 4.3.2)
  dplyr        * 1.1.4       2023-11-17 [1] CRAN (R 4.3.2)
  e1071          1.7-14      2023-12-06 [1] RSPM (R 4.3.2)
  ellipsis       0.3.2       2021-04-29 [1] RSPM (R 4.3.0)
  evaluate       0.23        2023-11-01 [1] RSPM (R 4.3.2)
  evd            2.3-6.1     2022-07-04 [1] RSPM (R 4.3.0)
  fansi          1.0.6       2023-12-08 [1] RSPM (R 4.3.2)
  farver         2.1.1       2022-07-06 [1] RSPM (R 4.3.0)
  fastmap        1.1.1       2023-02-24 [1] RSPM (R 4.3.0)
  forcats        1.0.0       2023-01-29 [1] RSPM (R 4.3.0)
  fs             1.6.3       2023-07-20 [1] RSPM (R 4.3.1)
  gamlss.dist    6.1-1       2023-08-23 [1] RSPM (R 4.3.1)
  gamm4        * 0.2-6       2020-04-03 [1] RSPM (R 4.3.0)
  generics       0.1.3       2022-07-05 [1] RSPM (R 4.3.0)
  ggokabeito     0.1.0       2021-10-18 [1] RSPM (R 4.3.0)
  ggplot2      * 3.5.0       2024-02-07 [1] Github (tidyverse/ggplot2@fa6d68d)
  GJRM         * 0.2-6.5     2024-01-25 [1] RSPM (R 4.3.2)
  glue           1.7.0       2024-01-09 [1] RSPM (R 4.3.2)
  gmp            0.7-4       2024-01-15 [1] RSPM (R 4.3.2)
VP gratia       * 0.8.9.4     2024-02-03 [?] load_all() (on disk 0.8.9.3)
  gsl            2.1-8       2023-01-24 [1] RSPM (R 4.3.0)
  gtable         0.3.4       2023-08-21 [1] RSPM (R 4.3.1)
  hms            1.1.3       2023-03-21 [1] RSPM (R 4.3.0)
  htmltools      0.5.7       2023-11-03 [1] RSPM (R 4.3.2)
  htmlwidgets    1.6.4       2023-12-06 [1] RSPM (R 4.3.2)
  httpgd         1.3.1       2023-01-30 [1] RSPM (R 4.3.0)
  httpuv         1.6.14      2024-01-26 [1] RSPM (R 4.3.2)
  ismev          1.42        2018-05-10 [1] RSPM (R 4.3.0)
  isoband        0.2.7       2022-12-20 [1] RSPM (R 4.3.0)
  jquerylib      0.1.4       2021-04-26 [1] RSPM (R 4.3.0)
  jsonlite       1.8.8       2023-12-04 [1] RSPM (R 4.3.2)
  KernSmooth     2.23-22     2023-07-10 [1] RSPM (R 4.3.1)
  knitr          1.45        2023-10-30 [1] RSPM (R 4.3.2)
  labeling       0.4.3       2023-08-29 [1] RSPM (R 4.3.1)
  later          1.3.2       2023-12-06 [1] RSPM (R 4.3.2)
  lattice        0.22-5      2023-10-24 [1] RSPM (R 4.3.2)
  lifecycle      1.0.4       2023-11-07 [1] RSPM (R 4.3.2)
  lme4         * 1.1-35.1    2023-11-05 [1] RSPM (R 4.3.2)
  magic          1.6-1       2022-11-16 [1] RSPM (R 4.3.0)
  magrittr       2.0.3       2022-03-30 [1] RSPM (R 4.3.0)
  mapproj        1.2.11      2023-01-12 [1] RSPM (R 4.3.0)
  maps           3.4.2       2023-12-15 [1] RSPM (R 4.3.2)
  MASS           7.3-60.0.1  2024-01-13 [1] RSPM (R 4.3.2)
  Matrix       * 1.6-5       2024-01-11 [1] RSPM (R 4.3.2)
  matrixStats    1.2.0       2023-12-11 [1] RSPM (R 4.3.2)
  memoise        2.0.1       2021-11-26 [1] RSPM (R 4.3.0)
  mgcv         * 1.9-1       2023-12-21 [1] RSPM (R 4.3.2)
  mime           0.12        2021-09-28 [1] RSPM (R 4.3.0)
  miniUI         0.1.1.1     2018-05-18 [1] RSPM (R 4.3.0)
  minqa          1.2.6       2023-09-11 [1] RSPM (R 4.3.1)
  mitools        2.4         2019-04-26 [1] RSPM (R 4.3.0)
  mnormt         2.1.1       2022-09-26 [1] RSPM (R 4.3.0)
  munsell        0.5.0       2018-06-12 [1] RSPM (R 4.3.0)
  mvnfast        0.2.8       2023-02-23 [1] RSPM (R 4.3.0)
  mvtnorm        1.2-4       2023-11-27 [1] RSPM (R 4.3.2)
  nlme         * 3.1-164     2023-11-27 [1] RSPM (R 4.3.2)
  nloptr         2.0.3       2022-05-26 [1] RSPM (R 4.3.0)
  numDeriv       2016.8-1.1  2019-06-06 [1] RSPM (R 4.3.0)
  patchwork      1.2.0       2024-01-08 [1] RSPM (R 4.3.2)
  pcaPP          2.0-4       2023-12-07 [1] RSPM (R 4.3.2)
  pillar         1.9.0       2023-03-22 [1] RSPM (R 4.3.0)
  pkgbuild       1.4.3       2023-12-10 [1] RSPM (R 4.3.2)
  pkgconfig      2.0.3       2019-09-22 [1] RSPM (R 4.3.0)
  pkgload        1.3.4       2024-01-16 [1] RSPM (R 4.3.2)
  processx       3.8.3       2023-12-10 [1] RSPM (R 4.3.2)
  profvis        0.3.8       2023-05-02 [1] RSPM (R 4.3.0)
  promises       1.2.1       2023-08-10 [1] RSPM (R 4.3.1)
  proxy          0.4-27      2022-06-09 [1] RSPM (R 4.3.0)
  ps             1.7.6       2024-01-18 [1] RSPM (R 4.3.2)
  pspline        1.0-19      2022-02-20 [1] RSPM (R 4.3.0)
  psych          2.4.1       2024-01-18 [1] RSPM (R 4.3.2)
  purrr          1.0.2       2023-08-10 [1] RSPM (R 4.3.1)
  R.cache        0.16.0      2022-07-21 [1] RSPM (R 4.3.0)
  R.methodsS3    1.8.2       2022-06-13 [1] RSPM (R 4.3.0)
  R.oo           1.26.0      2024-01-24 [1] RSPM (R 4.3.2)
  R.utils        2.12.3      2023-11-18 [1] CRAN (R 4.3.2)
  R6             2.5.1       2021-08-19 [1] RSPM (R 4.3.0)
  RColorBrewer   1.1-3       2022-04-03 [1] RSPM (R 4.3.0)
  Rcpp           1.0.12      2024-01-09 [1] RSPM (R 4.3.2)
  readr          2.1.5       2024-01-10 [1] RSPM (R 4.3.2)
  remotes        2.4.2.1     2023-07-18 [1] RSPM (R 4.3.1)
  reprex         2.1.0       2024-01-11 [1] RSPM (R 4.3.2)
  rlang          1.1.3       2024-01-10 [1] RSPM (R 4.3.2)
  rmarkdown      2.25        2023-09-18 [1] RSPM (R 4.3.1)
  Rmpfr          0.9-5       2024-01-21 [1] RSPM (R 4.3.2)
  rprojroot      2.0.4       2023-11-05 [1] RSPM (R 4.3.2)
  rstudioapi     0.15.0      2023-07-07 [1] RSPM (R 4.3.1)
  sass           0.4.8       2023-12-06 [1] RSPM (R 4.3.2)
  scales         1.3.0       2023-11-28 [1] RSPM (R 4.3.2)
  scam         * 1.2-15      2024-01-25 [1] RSPM (R 4.3.2)
  sessioninfo    1.2.2       2021-12-06 [1] RSPM (R 4.3.0)
  sf             1.0-15      2023-12-18 [1] RSPM (R 4.3.2)
  shiny        * 1.8.0       2023-11-17 [1] CRAN (R 4.3.2)
  stabledist     0.7-1       2016-09-12 [1] RSPM (R 4.3.0)
  stringi        1.8.3       2023-12-11 [1] RSPM (R 4.3.2)
  stringr        1.5.1       2023-11-14 [1] RSPM (R 4.3.2)
  styler         1.10.2.9000 2024-02-07 [1] Github (r-lib/styler@775c399)
  survey         4.2-1       2023-05-03 [1] RSPM (R 4.3.0)
  survival       3.5-7       2023-08-14 [1] RSPM (R 4.3.1)
  systemfonts    1.0.5       2023-10-09 [1] RSPM (R 4.3.2)
  testthat     * 3.2.1       2023-12-02 [1] RSPM (R 4.3.2)
  tibble       * 3.2.1       2023-03-20 [1] CRAN (R 4.3.0)
  tidyr          1.3.1       2024-01-24 [1] RSPM (R 4.3.2)
  tidyselect     1.2.0       2022-10-10 [1] RSPM (R 4.3.0)
  trust          0.1-8       2020-01-10 [1] RSPM (R 4.3.0)
  tzdb           0.4.0       2023-05-12 [1] RSPM (R 4.3.0)
  units          0.8-5       2023-11-28 [1] RSPM (R 4.3.2)
  urlchecker     1.0.1       2021-11-30 [1] RSPM (R 4.3.0)
  usethis      * 2.2.2       2023-07-06 [1] RSPM (R 4.3.1)
  utf8           1.2.4       2023-10-22 [1] RSPM (R 4.3.1)
  vctrs          0.6.5       2023-12-01 [1] RSPM (R 4.3.2)
  vdiffr         1.0.7       2023-09-22 [1] CRAN (R 4.3.1)
  VGAM           1.1-9       2023-09-19 [1] RSPM (R 4.3.1)
  VineCopula     2.5.0       2023-07-10 [1] RSPM (R 4.3.1)
  viridisLite    0.4.2       2023-05-02 [1] RSPM (R 4.3.0)
  waldo          0.5.2       2023-11-02 [1] RSPM (R 4.3.2)
  withr          3.0.0       2024-01-16 [1] RSPM (R 4.3.2)
  xfun           0.41        2023-11-01 [1] RSPM (R 4.3.2)
  xtable         1.8-4       2019-04-21 [1] RSPM (R 4.3.0)
  yaml           2.3.8       2023-12-11 [1] RSPM (R 4.3.2)

[1] /home/au690221/R/x86_64-pc-linux-gnu-library/4.3
[2] /usr/local/lib/R/site-library
[3] /usr/lib/R/site-library
[4] /usr/lib/R/library

V ── Loaded and on-disk version mismatch.
P ── Loaded and on-disk path mismatch.

─────────────────────────────────────────────────────────────────────────────────────────────────────

gavinsimpson avatar Feb 07 '24 11:02 gavinsimpson