local()
può implementare un pattern Singleton - per esempio, il pacchetto snow
utilizza per monitorare la singola istanza RMPI che l'utente potrebbe creare.
getMPIcluster <- NULL
setMPIcluster <- NULL
local({
cl <- NULL
getMPIcluster <<- function() cl
setMPIcluster <<- function(new) cl <<- new
})
local()
potrebbe anche essere utilizzato per gestire la memoria in uno script, ad esempio, allocare grandi oggetti intermedi necessari per creare un oggetto finale nell'ultima riga della clausola. I grandi oggetti intermedi sono disponibili per la garbage collection quando restituisce local
.
L'utilizzo di una funzione per creare una chiusura è un modello predefinito: l'esempio bank account nella documentazione Introduzione a R, in cui ogni volta che viene richiamato open.account
, viene creato un nuovo account.
Come @otsaw menzioni, Memoizzazione potrebbe essere implementato usando locale, ad esempio, ai siti web di cache in un cingolato
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())
(il solito esempio di Memoizzazione, numeri di Fibonacci, non è soddisfacente - la gamma di i numeri che non superano la rappresentazione numerica di R sono piccoli, quindi probabilmente si utilizzerà una tabella di ricerca di valori precalcolati in modo efficiente). Interessante come il crawler qui è un singleton; avrebbe potuto facilmente seguire uno schema di fabbrica, quindi un crawler per URL base.
Un altro modello che 'local' rende conveniente è la memoizzazione. C'è un esempio da qualche parte in The R Inferno. – otsaw
Il tuo pensiero sul crawler che è un singleton è interessante perché un'alternativa al local è di valutare immediatamente una funzione anonima senza argomenti - un pattern factory potrebbe utilizzare una chiusura sull'URL di base. – hadley