The Cookbook: Getting started with R

R

Some of the most downloaded R packages are built on Travis CI. In this cookbook, you’ll see how easy it just is to setup Travis CI in an existing R project.

Getting started with R

Let’s assume you have a file called basic_operations.R, and it reads something like this:

add <- function(a, b){
  result <- a + b
  return(result)
}


subtract <- function(a, b){
  result <- a - b
  return(result)
}

divide <- function(numerator, denominator){
  if(denominator == 0){
    stop("Nah")
  }
  else {
    result <- numerator / denominator
    return(result)
  }
}

Implementing Travis CI

Now, you want to have automated testing. Thankfully there’s Travis CI! Let’s start off with the .travis.yml file:

language: R
cache: packages
warnings_are_errors: false

Unit Tests

For unit tests, we want to use something called testthat. Let’s say we named our whole project sampleR. Your initial testthat.R file would look similar to this:

library(testthat)
library(sampleR)

test_check("sampleR")

In your tests directory, you’ll notice /tests/testthat and let’s say you have a file in there entitled test-basic_operations.R, and it goes as follows:

test_that("addition works", {

  a <- runif(1)
  b <- runif(1)
  
  expect_equal(a + b, add(a, b))
  
  a <- -1 * runif(1)
  b <- runif(1)
  
  expect_equal(a + b, add(a, b))
})

test_that("subtraction works", {

  a <- runif(1)
  b <- runif(1)
  
  expect_equal(a - b, subtract(a, b))
 
  a <- -1 * runif(1)
  b <- runif(1)
  
  expect_equal(a - b, subtract(a, b))
})

test_that("division errors if zero", {
  expect_error(divide(1, 0), "Nah")
})

test_that("division works", {
 
  a <- runif(1)
  b <- runif(1)
  
  expect_equal(a / b, divide(a, b))
  
  a <- -1 * runif(1)
  b <- runif(1)
  
  expect_equal(a / b, divide(a, b))
})

You can see in this unit test, we are testing if division, addition, and subtraction passes the unit test.

Finishing up

At this point, you’re all set, and ready for your R project to build. Last but not least, there are alternative ways to get packages when building out your .travis.yml. For example if I wanted to get packages from GitHub, it would look something like this:

r_github_packages: r-lib/testthat

The other alternative is to use CRAN. This is how it would look grabbing your package from CRAN:

r_packages:
  - testthat

Slight variants, but just different methods on getting the same package. It just comes down to your own approach and method.