Cyclomatic complexity of R functions and expressions
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
R
man
tests
.Rbuildignore
.gitignore
.travis.yml
DESCRIPTION
LICENSE
Makefile
NAMESPACE
NEWS.md
README.Rmd
README.md
appveyor.yml

README.md

cyclocomp

Cyclomatic Complexity of R Code

Project Status: Active - The project has reached a stable, usable state and is being actively developed. Linux Build Status Windows Build status CRAN RStudio mirror downloads Coverage Status

Cyclomatic complexity is a software metric (measurement), used to indicate the complexity of a program. It is a quantitative measure of the number of linearly independent paths through a program's source code. It was developed by Thomas J. McCabe, Sr. in 1976.

Installation

devtools::install_github("MangoTheCat/cyclocomp")

Usage

library(cyclocomp)

cyclocomp takes quoted R expressions or function objects, and returns a single integer, the cyclomatic complexity of the expression or function.

cyclocomp(quote( if (condition) "foo" else "bar" ))
#> [1] 2
cyclocomp(quote( while (condition) { loop } ))
#> [1] 3
cyclocomp(
  function(arg) { calulate(this); and(that) }
)
#> [1] 1
cyclocomp(ls)
#> [1] 10
cyclocomp(cyclocomp)
#> [1] 1

Some more examples for the R control structures. A simple if first:

cyclocomp(quote({
  if (condition) this
}))
#> [1] 2

An if with an else branch:

cyclocomp(quote({
  if (condition) this else that
}))
#> [1] 2

Loops:

cyclocomp(quote({
  for (var in seq) expr
}))
#> [1] 3
cyclocomp(quote({
  while (cond) expr
}))
#> [1] 3
cyclocomp(quote({
  repeat expr
}))
#> [1] 2

break and next statements add to the complexity:

cyclocomp(quote({
  for (var in seq) {
    this
    break
    that
  }
}))
#> [1] 4
cyclocomp(quote({
  for (var in seq) {
    this
    next
    that
  }
}))
#> [1] 4

Multiple (explicit or implicit) return calls also add to the complexity:

f <- function(arg) {
  if (arg) {
    return("this")
  } else {
    return("that")
  }
  "Otherwise return me"
}
cyclocomp(f)
#> [1] 4

License

MIT © Mango Solutions