Формалы для функции существуют как объекты в среде функции, как только экземпляр функции загружается в память при вызове. В Advanced R Хэдли Уикхем называет эту среду средой исполнения . Доступ к ячейкам памяти объектов осуществляется через pryr::address()
.
В качестве примера я буду использовать модифицированную версию кода, которую я ранее написал, чтобы проиллюстрировать области памяти в функции makeVector()
из второго программного задания для курса Джона Хопкинса R Программирование на coursera.org .
makeVector <- function(x = 200) {
library(pryr)
message(paste("Address of x argument is:",address(x)))
message(paste("Number of references to x is:",refs(x)))
m <- NULL
set <- function(y) {
x <<- y
message(paste("set() address of x is:",address(x)))
message(paste("Number of references to x is:",refs(x)))
m <<- NULL
}
get <- function() x
setmean <- function(mean) m <<- mean
getmean <- function() m
list(set = set, get = get,
setmean = setmean,
getmean = getmean)
}
Как указано выше, makeVector()
- это объект S3, что означает, что мы можем получить доступ к объектам в его окружении через методы получения и установки, также известные как методы мутатора .
Мы можем загрузить экземпляр объекта makeVector()
в память и запросить адрес и значение x
с помощью следующего кода.
makeVector()$get()
... и результат:
> makeVector()$get()
Address of x argument is: 0x1103df4e0
Number of references to x is: 0
[1] 200
>
Как видно из вывода, x
имеет место в памяти, но нет других объектов, которые содержат ссылки на него. Также для x
было установлено значение по умолчанию вектора длины 1 со значением 200.
Я предоставляю подробное описание объектов в среде makeVector()
в своем ответе на Кэширование среднего вектора в R .
Что касается вопроса о том, как долго формалы существуют в памяти, они существуют до тех пор, пока среда, созданная для хранения вызываемого экземпляра функции, находится в памяти. Поскольку сборщик мусора работает с объектами, которые не имеют внешних ссылок, если экземпляр функции не сохраняется в объекте, он может быть использован для сборки мусора, как только вызов функции вернет результат в родительскую среду.