## ----echo = FALSE--------------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
## ------------------------------------------------------------------------
library(R6)
# Simulate packages by creating environments
pkgA <- new.env()
pkgB <- new.env()
# Create a function in pkgA but not pkgB
pkgA$fun <- function() 10
ClassA <- R6Class("ClassA",
  portable = FALSE,
  public = list(
    foo = function() fun()
  ),
  parent_env = pkgA
)
# ClassB inherits from ClassA
ClassB <- R6Class("ClassB",
  portable = FALSE,
  inherit = ClassA,
  parent_env = pkgB
)
## ------------------------------------------------------------------------
a <- ClassA$new()
a$foo()
## ----eval=FALSE----------------------------------------------------------
#  b <- ClassB$new()
#  b$foo()
#  #> Error in b$foo() : could not find function "fun"
## ------------------------------------------------------------------------
pkgA <- new.env()
pkgB <- new.env()
pkgA$fun <- function() {
  "This function `fun` in pkgA"
}
ClassA <- R6Class("ClassA",
  portable = TRUE,  # The default
  public = list(
    foo = function() fun()
  ),
  parent_env = pkgA
)
ClassB <- R6Class("ClassB",
  portable = TRUE,
  inherit = ClassA,
  parent_env = pkgB
)
a <- ClassA$new()
a$foo()
b <- ClassB$new()
b$foo()
## ------------------------------------------------------------------------
pkgC <- new.env()
pkgC$fun <- function() {
  "This function `fun` in pkgC"
}
ClassC <- R6Class("ClassC",
  portable = TRUE,
  inherit = ClassA,
  public = list(
    foo = function() fun()
  ),
  parent_env = pkgC
)
cc <- ClassC$new()
# This method is defined in ClassC, so finds pkgC$fun
cc$foo()
## ------------------------------------------------------------------------
NP <- R6Class("NP",
  portable = FALSE,
  public = list(
    x = 1,
    getxy = function() c(x, y),
    sety = function(value) y <<- value
  ),
  private = list(
    y = NA
  )
)
np <- NP$new()
np$sety(20)
np$getxy()
## ----eval=FALSE----------------------------------------------------------
#  P <- R6Class("P",
#    portable = TRUE,
#    public = list(
#      x = 1,
#      getxy = function() c(x, y),
#      sety = function(value) y <<- value
#    ),
#    private = list(
#      y = NA
#    )
#  )
#  
#  p <- P$new()
#  
#  # No error, but instead of setting private$y, this sets y in the global
#  # environment! This is because of the sematics of <<-.
#  p$sety(20)
#  y
#  #> [1] 20
#  
#  p$getxy()
#  #> Error in p$getxy() : object 'y' not found
## ------------------------------------------------------------------------
P2 <- R6Class("P2",
  portable = TRUE,
  public = list(
    x = 1,
    getxy = function() c(self$x, private$y),
    sety = function(value) private$y <- value
  ),
  private = list(
    y = NA
  )
)
p2 <- P2$new()
p2$sety(20)
p2$getxy()
## ----eval=FALSE----------------------------------------------------------
#  ClassB <- R6Class("ClassB",
#    inherit = pkgA::ClassA,
#    public = list(x = 1)
#  )
#  
#  # We'll fill this at load time
#  objB <- NULL
#  
#  .onLoad <- function(libname, pkgname) {
#    # The namespace is locked after loading; we can still modify objB at this time.
#    objB <<- ClassB$new()
#  }
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.