# cyclocomp

Cyclomatic Complexity of R Code

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" ))``
``#>  2``
``cyclocomp(quote( while (condition) { loop } ))``
``#>  3``
``````cyclocomp(
function(arg) { calulate(this); and(that) }
)``````
``#>  1``
``cyclocomp(ls)``
``#>  10``
``cyclocomp(cyclocomp)``
``#>  1``

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

``````cyclocomp(quote({
if (condition) this
}))``````
``#>  2``

An `if` with an `else` branch:

``````cyclocomp(quote({
if (condition) this else that
}))``````
``#>  2``

Loops:

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

`break` and `next` statements add to the complexity:

``````cyclocomp(quote({
for (var in seq) {
this
break
that
}
}))``````
``#>  4``
``````cyclocomp(quote({
for (var in seq) {
this
next
that
}
}))``````
``#>  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)``````
``#>  4``