lintr icon indicating copy to clipboard operation
lintr copied to clipboard

Field access in methods for ReferenceClass definition are flagged despite using .self prefix

Open linusjf opened this issue 5 years ago • 2 comments

lintr flags .self prefix in definition of methods in ReferenceClass in R while accessing field variables.

#!/usr/bin/env Rscript

main <- function(argv) {
  student <- setRefClass(
    "student",
    fields =
      list(
        name = "character",
        grad_year = "numeric",
        credits = "numeric",
        id = "character",
        courses = "list"
      ),
    # nolint start
    methods =
      list(
        hello = function() {
          paste("Hi! My name is", .self$name)
        },
        add_credits = function(n) {
          .self$credits <- .self$credits + n
        },
        get_email = function() {
          paste0(.self$id, "@jhu.edu")
        }
      )
  )
  # nolint end
  brooke <- student$new(
    name = "Brooke",
    grad_year = 2019,
    credits = 40,
    id = "ba123",
    courses = list(
      "Ecology",
      "Calculus III"
    )
  )

  roger <- student$new(
    name = "Roger",
    grad_year = 2020,
    credits = 10,
    id = "rp456",
    courses = list(
      "Puppetry",
      "Elementary Algebra"
    )
  )
  print(brooke)
  print(roger)
  print(brooke$credits)
  print(roger$hello())
  print(roger$get_email())
  print(brooke$credits)
  brooke$add_credits(4)
  print(brooke$credits)

  grad_student <- setRefClass(
    "grad_student",
    contains =
      "student",
    fields =
      list(
        thesis_topic = "character"
      ),
    # nolint start
    methods =
      list(
        defend = function() {
          paste0(.self$thesis_topic, ". QED.")
        }
      )
  )

  # nolint end
  jeff <- grad_student$new(
    name = "Jeff", grad_year = 2021, credits = 8,
    id = "jl55", courses = list(
      "Fitbit Repair",
      "Advanced Base Graphics"
    ),
    thesis_topic = "Batch Effects"
  )

  print(jeff$defend())
  return(0)
}

if (identical(environment(), globalenv())) {
  quit(status = main(commandArgs(trailingOnly = TRUE)))
}

linusjf avatar Feb 04 '20 16:02 linusjf

This will be rather hard to fix in lintr, since that's reported by codetools::checkUsage() directly and the function that is being checked is main(). If the reference classes are assigned at the top level, no lints are produced because object_usage_linter() currently doesn't check usage of non-top-level functions.

AshesITR avatar Jun 19 '22 16:06 AshesITR

Minimal reproducible example:

library(lintr)

lint('
  main <- function(argv) {
  student <- setRefClass(
    "student",
    fields = list(name = "character"),
    methods = list(hello = function() paste("Hi! My name is", .self$name))
  )

  brooke <- student$new(name = "Brooke")
  print(brooke)
  }',
  linters = object_usage_linter()
)
#> <text>:6:63: warning: [object_usage_linter] no visible binding for global variable '.self'
#>     methods = list(hello = function() paste("Hi! My name is", .self$name))
#>                                                               ^~~~~

Created on 2022-09-25 with reprex v2.0.2

Session info
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.2.1 (2022-06-23)
#>  os       macOS Monterey 12.5.1
#>  system   aarch64, darwin20
#>  ui       X11
#>  language (EN)
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       Europe/Berlin
#>  date     2022-09-25
#>  pandoc   2.19.2 @ /usr/local/bin/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package      * version    date (UTC) lib source
#>  callr          3.7.2      2022-08-22 [1] CRAN (R 4.2.0)
#>  cli            3.4.1      2022-09-23 [1] CRAN (R 4.2.1)
#>  codetools      0.2-18     2020-11-04 [1] CRAN (R 4.2.1)
#>  crayon         1.5.1      2022-03-26 [1] CRAN (R 4.2.0)
#>  cyclocomp      1.1.0      2016-09-10 [1] CRAN (R 4.2.0)
#>  desc           1.4.2      2022-09-08 [1] CRAN (R 4.2.1)
#>  digest         0.6.29     2021-12-01 [1] CRAN (R 4.2.0)
#>  evaluate       0.16       2022-08-09 [1] CRAN (R 4.2.1)
#>  fansi          1.0.3      2022-03-24 [1] CRAN (R 4.2.0)
#>  fastmap        1.1.0      2021-01-25 [1] CRAN (R 4.2.0)
#>  fs             1.5.2      2021-12-08 [1] CRAN (R 4.2.0)
#>  glue           1.6.2      2022-02-24 [1] CRAN (R 4.2.0)
#>  highr          0.9        2021-04-16 [1] CRAN (R 4.2.0)
#>  htmltools      0.5.3      2022-07-18 [1] CRAN (R 4.2.1)
#>  knitr          1.40       2022-08-24 [1] CRAN (R 4.2.1)
#>  lazyeval       0.2.2      2019-03-15 [1] CRAN (R 4.2.0)
#>  lifecycle      1.0.2      2022-09-09 [1] CRAN (R 4.2.1)
#>  lintr        * 3.0.1.9000 2022-09-25 [1] local
#>  magrittr       2.0.3      2022-03-30 [1] CRAN (R 4.2.0)
#>  pillar         1.8.1      2022-08-19 [1] CRAN (R 4.2.1)
#>  pkgconfig      2.0.3      2019-09-22 [1] CRAN (R 4.2.0)
#>  processx       3.7.0      2022-07-07 [1] CRAN (R 4.2.1)
#>  ps             1.7.1      2022-06-18 [1] CRAN (R 4.2.0)
#>  purrr          0.3.4      2020-04-17 [1] CRAN (R 4.2.0)
#>  R.cache        0.16.0     2022-07-21 [1] CRAN (R 4.2.0)
#>  R.methodsS3    1.8.2      2022-06-13 [1] CRAN (R 4.2.0)
#>  R.oo           1.25.0     2022-06-12 [1] CRAN (R 4.2.0)
#>  R.utils        2.12.0     2022-06-28 [1] CRAN (R 4.2.0)
#>  R6             2.5.1.9000 2022-08-06 [1] Github (r-lib/R6@87d5e45)
#>  remotes        2.4.2      2021-11-30 [1] CRAN (R 4.2.0)
#>  reprex         2.0.2      2022-08-17 [1] CRAN (R 4.2.1)
#>  rex            1.2.1      2021-11-26 [1] CRAN (R 4.2.0)
#>  rlang          1.0.6      2022-09-24 [1] CRAN (R 4.2.1)
#>  rmarkdown      2.16       2022-08-24 [1] CRAN (R 4.2.1)
#>  rprojroot      2.0.3      2022-04-02 [1] CRAN (R 4.2.0)
#>  rstudioapi     0.14       2022-08-22 [1] CRAN (R 4.2.1)
#>  sessioninfo    1.2.2      2021-12-06 [1] CRAN (R 4.2.0)
#>  stringi        1.7.8      2022-07-11 [1] CRAN (R 4.2.1)
#>  stringr        1.4.1      2022-08-20 [1] CRAN (R 4.2.1)
#>  styler         1.7.0.9002 2022-09-13 [1] local
#>  tibble         3.1.8      2022-07-22 [1] CRAN (R 4.2.1)
#>  utf8           1.2.2      2021-07-24 [1] CRAN (R 4.2.0)
#>  vctrs          0.4.1      2022-04-13 [1] CRAN (R 4.2.0)
#>  withr          2.5.0      2022-03-03 [1] CRAN (R 4.2.0)
#>  xfun           0.33       2022-09-12 [1] CRAN (R 4.2.1)
#>  xml2           1.3.3      2021-11-30 [1] CRAN (R 4.2.0)
#>  xmlparsedata   1.0.5      2021-03-06 [1] CRAN (R 4.2.0)
#>  yaml           2.3.5      2022-02-21 [1] CRAN (R 4.2.0)
#> 
#>  [1] /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/library
#> 
#> ──────────────────────────────────────────────────────────────────────────────

IndrajeetPatil avatar Sep 25 '22 08:09 IndrajeetPatil