Skip to content

gaborcsardi/disposables

Repository files navigation

Disposable R packages, for testing purposes

R-CMD-check CRAN RStudio mirror downloads Codecov test coverage

Features

The disposable packages are installed in R's temporary directory, so they are cleaned up at the end of the R session.

disposables cleans up after itself, if an error happens during the installation or loading of the disposable packages. If make_packages() fails because of an error, it leaves to temporary garbage behind. In particular,

  • it cleans up the library path and restores .libPaths(),
  • removes the temporary source package directories,
  • removes the installes packages from lib_dir, and
  • unloads the packages that it loaded before the error.

Installation

Install the package from CRAN:

install.packages("disposables")

Usage

make_packages() creates, installs and loads R packages, it takes named expressions, the names will be used as package names.

library(disposables)
pkgs <- make_packages(
  foo1 = { f <- function() print("hello!") ; d <- 1:10 },
  foo2 = { f <- function() print("hello again!") ; d <- 11:20 }
)

The foo1 and foo2 packages are now loaded.

"package:foo1" %in% search()
#> [1] TRUE
"package:foo2" %in% search()
#> [1] TRUE

You can dispose them with dispose_packages(). This unloads the packages and deletes them from the library directory.

dispose_packages(pkgs)
"package:foo1" %in% search()
#> [1] FALSE
"package:foo2" %in% search()
#> [1] FALSE
file.exists(pkgs$lib_dir)
#> [1] FALSE

Here is a real example that tests cross-package inheritence of R6 classes.

library(disposables)
library(testthat)
test_that("inheritance works across packages", {

  pkgs <- make_packages(
    imports = "R6",

    ## Code to put in package 'R6testA'
    R6testA = {
      AC <- R6Class(
        public = list(
          x = 1
        )
      )
    },

    ## Code to put in package 'R6testB'
    R6testB = {
      BC <- R6Class(
        inherit = R6testA::AC,
        public = list(
          y = 2
        )
      )
    }

  )

  ## In case of an error below
  on.exit(try(dispose_packages(pkgs), silent = TRUE), add = TRUE)

  ## Now ready for the tests
  B <- BC$new()
  expect_equal(B$x, 1)
  expect_equal(B$y, 2)

})

License

MIT @ Gábor Csárdi