R: Где формалы для функции хранятся в памяти? - PullRequest
0 голосов
/ 29 апреля 2018

Когда функция была определена, но еще не была вызвана, существуют ли формалы, которые не имеют значений по умолчанию? Если они есть, существуют ли они в среде выполнения или в среде, где находится определение функции, или где-то еще?

Если функция была определена, но еще не вызвана, а формалу присвоено значение по умолчанию, существует ли это значение? Если да, то в какой среде он существует? Если выражение по умолчанию оценивается как константа, присвоено ли формальное значение этому значению, которое будет перезаписано при вызове функции, если задано значение? Если нет, то в какой среде это (фиксированное) значение по умолчанию находится между моментом определения и временем вызова функции?

После того, как функция была вызвана и фактические значения или значения по умолчанию были присвоены формалам, переданы в тело и, если необходимо, определены и / или оценены, продолжают ли формальности существовать? Если да, то в каких условиях они существуют?

1 Ответ

0 голосов
/ 29 апреля 2018

Формалы для функции существуют как объекты в среде функции, как только экземпляр функции загружается в память при вызове. В 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 .

Что касается вопроса о том, как долго формалы существуют в памяти, они существуют до тех пор, пока среда, созданная для хранения вызываемого экземпляра функции, находится в памяти. Поскольку сборщик мусора работает с объектами, которые не имеют внешних ссылок, если экземпляр функции не сохраняется в объекте, он может быть использован для сборки мусора, как только вызов функции вернет результат в родительскую среду.

...