new_pair <- function(v1, v2) {
structure(list(v1 = v1, v2 = v2),
class = "Pair")
}
swap <- function(pair) UseMethod("swap")
# S3: a changed copy comes back
swap.Pair <- function(pair) {
new_pair(pair$v2, pair$v1)
}
pair <- new_pair("A", "B")
swapped <- swap(pair)
# swapped$v1 = B
# swapped$v2 = A
# pair$v1 = A
# A reference class changes in place
RefPair <- setRefClass("RefPair",
fields = list(v1 = "character",
v2 = "character"),
methods = list(
swap = function() {
old_v1 <- v1
v1 <<- v2
v2 <<- old_v1
}
)
)
ref_pair <- RefPair$new(v1 = "A", v2 = "B")
ref_pair$swap()
# ref_pair$v1 = B
# ref_pair$v2 = A
cat("swapped$v1 =", swapped$v1, "\n")
cat("swapped$v2 =", swapped$v2, "\n")
cat("pair$v1 =", pair$v1, "\n")
cat("ref_pair$v1 =", ref_pair$v1, "\n")
cat("ref_pair$v2 =", ref_pair$v2, "\n")