local()
может реализовать шаблон синглтона - например, пакет snow
использует это для отслеживания одного экземпляра Rmpi, который может создать пользователь.
getMPIcluster <- NULL
setMPIcluster <- NULL
local({
cl <- NULL
getMPIcluster <<- function() cl
setMPIcluster <<- function(new) cl <<- new
})
local()
также может использоваться для управления памятью в сценарии, например, для выделения больших промежуточных объектов, необходимых для создания конечного объекта в последней строке предложения. Большие промежуточные объекты доступны для сборки мусора, когда local
возвращает.
Использование функции для создания закрытия - это фабричный шаблон - пример банковский счет в документации Введение в R, где каждый раз, когда вызывается open.account
, создается новая учетная запись.
Как упоминает @otsaw, запоминание может быть реализовано с использованием локального, например, для кэширования веб-сайтов в сканере
library(XML)
crawler <- local({
seen <- new.env(parent=emptyenv())
.do_crawl <- function(url, base, pattern) {
if (!exists(url, seen)) {
message(url)
xml <- htmlTreeParse(url, useInternal=TRUE)
hrefs <- unlist(getNodeSet(xml, "//a/@href"))
urls <-
sprintf("%s%s", base, grep(pattern, hrefs, value=TRUE))
seen[[url]] <- length(urls)
for (url in urls)
.do_crawl(url, base, pattern)
}
}
.do_report <- function(url) {
urls <- as.list(seen)
data.frame(Url=names(urls), Links=unlist(unname(urls)),
stringsAsFactors=FALSE)
}
list(crawl=function(base, pattern="^/.*html$") {
.do_crawl(base, base, pattern)
}, report=.do_report)
})
crawler$crawl(favorite_url)
dim(crawler$report())
(обычный пример запоминания, числа Фибоначчи, не удовлетворяет - диапазон чисел, который не переполняет числовое представление R, мал, поэтому, вероятно, следует использовать справочную таблицу с эффективно предварительно вычисленными значениями) , Интересно, насколько гусеничным является синглтон; можно было бы легко следовать заводскому шаблону, поэтому один сканер на базовый URL.