Сквозные параметры (in-out)

Классы / Методы

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")