local()
można realizować Singleton - przykład opakowanie snow
wykorzystuje to śledzenie jednego wystąpienia RMPI, które użytkownik może tworzyć.
getMPIcluster <- NULL
setMPIcluster <- NULL
local({
cl <- NULL
getMPIcluster <<- function() cl
setMPIcluster <<- function(new) cl <<- new
})
local()
może być również używany do zarządzania pamięcią w skrypcie przykład przydzielania dużych obiektów pośrednich potrzebnych do uzyskania końcowego przedmiotu na ostatniej linii punktu. Duże obiekty pośrednie są dostępne do zbierania śmieci po zwrocie local
.
Użycie funkcji do utworzenia zamknięcia to wzór fabryczny - przykład bank account w dokumentacji Wprowadzenie do R, gdzie za każdym razem wywoływana jest open.account
, tworzone jest nowe konto.
Jak @otsaw wspomina, memoization mogą być realizowane z wykorzystaniem lokalnych, na przykład, do pamięci podręcznej stron internetowych w robota
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())
(zwykle przykładem memoization, liczby Fibonacciego, nie jest satysfakcjonująca - zakres liczby, które nie przepełniają liczbowej reprezentacji R, są małe, więc prawdopodobnie użyjemy tabeli przeglądowej efektywnie wyliczonych wartości). Interesujące, jak robota tutaj jest singleton; równie dobrze mógł być zgodny ze wzorcem fabrycznym, więc jeden robot na podstawowy adres URL.
Innym wzorem, który "lokalnie" sprawia, że jest wygodny, jest zapamiętywanie. Jest taki przykład w The R Inferno. – otsaw
Twoja myśl o robocie będącym singletonem jest interesująca, ponieważ alternatywą dla lokalnego jest natychmiastowa ocena anonimowej funkcji bez argumentów - wzorzec fabryki może wykorzystywać zamknięcie ponad bazowym adresem URL. – hadley