In base alla risposta fornita in 1088639, ho impostato una coppia di funzioni che accedono entrambe allo stesso ambiente della sottofunzione. Questo esempio funziona, ma volevo vedere se mi fosse sfuggito un modo più semplice per "collegare" entrambe le funzioni di primo livello all'ambiente interno.Un modo corretto per consentire a due funzioni di accedere all'ambiente di una singola funzione?
(Indietro storia:. Volevo scrivere un paio di funzionalità complementari che condividono una variabile, ad esempio "contare" in questo esempio, e requisiti pacchetto incontrano CRAN che non consentono le funzioni di modificare l'ambiente globale)
static.f <- function() {
count <- 0
f <- function(x) {
count <<- count + 1
return(list(mean=mean(x), count=count))
}
return(f)
}
# make sure not to delete this command, even tho' it's not
# creating a function.
f1 <- static.f()
statfoo <- function(x){
tmp<-f1(x)
tmp<- list(tmp,plus=2)
return(tmp)
}
statbar <- function(x){
tmp<-f1(x)
tmp<- list(tmp,minus=3)
return(tmp)
}
Esempio di output:
> statfoo(5)
[[1]]
[[1]]$mean
[1] 5
[[1]]$count
[1] 1
$plus
[1] 2
Rgames> statfoo(5)
[[1]]
[[1]]$mean
[1] 5
[[1]]$count
[1] 2
$plus
[1] 2
> statbar(4)
[[1]]
[[1]]$mean
[1] 4
[[1]]$count
[1] 3
$minus
[1] 3
> statfoo(5)
[[1]]
[[1]]$mean
[1] 5
[[1]]$count
[1] 4
$plus
[1] 2
Penso che tutte le risposte postate siano buone. Ho selezionato Flick perché non richiede un pacchetto aggiuntivo ('proto') e non richiede un costrutto' func $ part' o un comando di configurazione ('environment (f1) <- environment (f2) <- list2env (lista (count = 0)) ') come la risposta altrimenti eccellente di Brodie. –