Когда R ищет символ, он смотрит в текущую среду, затем в родительскую среду и так далее. Он не назначил envCache в глобальной среде. Один из способов реализовать то, что вы хотели бы сделать, - создать «замыкание», которое запоминает состояние, в соответствии с
makeCache <- function() {
cache <- new.env(parent=emptyenv())
list(get = function(key) cache[[key]],
set = function(key, value) cache[[key]] <- value,
## next two added in response to @sunpyg
load = function(rdaFile) load(rdaFile, cache),
ls = function() ls(cache))
}
вызывает makeCache()
возвращает список из двух функций, get
и set
.
a <- makeCache()
Каждая функция имеет среду, в которой она была определена (среда, созданная при вызове makeCache()
). Когда вы вызываете a$set("a", 1)
, правила поиска переменных означают, что R ищет переменную cache
, сначала внутри функции aCache$set
, а когда она не находит ее там, в среде, в которой set
была определены.
> a$get("foo")
NULL
> a$set("foo", 1)
> a$get("foo")
[1] 1
Круто, а? Обратите внимание, что parent=emptyenv())
означает, что get()
для несуществующих ключей перестает искать в cache
, в противном случае он продолжил бы поиск в родительской среде кэша и т. Д.
В документе «Введение в R» приведен пример банковского счета , действительно забавный. В ответ на комментарий @ sunpyg я добавил функцию load
и ls
для добавления данных из файла Rda и для отображения содержимого кэша, например, a$load("foo.Rda")
.