R Language
Ambito delle variabili
Ricerca…
Osservazioni
La trappola più comune con lo scopo sorge nella parallelizzazione. Tutte le variabili e le funzioni devono essere passate in un nuovo ambiente che viene eseguito su ciascun thread.
Ambienti e funzioni
Le variabili dichiarate all'interno di una funzione esistono solo (se non superate) all'interno di quella funzione.
x <- 1
foo <- function(x) {
y <- 3
z <- x + y
return(z)
}
y
Errore: oggetto 'y' non trovato
Le variabili passate in una funzione e quindi riassegnate vengono sovrascritte, ma solo all'interno della funzione .
foo <- function(x) {
x <- 2
y <- 3
z <- x + y
return(z)
}
foo(1)
x
5
1
Le variabili assegnate in un ambiente superiore a una funzione esistono all'interno di quella funzione, senza essere passate.
foo <- function() {
y <- 3
z <- x + y
return(z)
}
foo()
4
Funzioni secondarie
Le funzioni chiamate all'interno di una funzione (es. Sottofunzioni) devono essere definite all'interno di quella funzione per accedere a qualsiasi variabile definita nell'ambiente locale senza essere passata.
Questo fallisce:
bar <- function() {
z <- x + y
return(z)
}
foo <- function() {
y <- 3
z <- bar()
return(z)
}
foo()
Errore in bar (): oggetto 'y' non trovato
Questo funziona:
foo <- function() {
bar <- function() {
z <- x + y
return(z)
}
y <- 3
z <- bar()
return(z)
}
foo()
4
Assegnazione globale
Le variabili possono essere assegnate globalmente da qualsiasi ambiente usando <<-
. bar()
ora può accedere a y
.
bar <- function() {
z <- x + y
return(z)
}
foo <- function() {
y <<- 3
z <- bar()
return(z)
}
foo()
4
L'incarico globale è altamente scoraggiato. L'uso di una funzione wrapper o di chiamare esplicitamente variabili da un altro ambiente locale è molto preferito.
Assegnazione esplicita di ambienti e variabili
Gli ambienti in R possono essere chiamati e nominati in modo esplicito. Le variabili possono essere assegnate e chiamate esplicitamente da o verso quegli ambienti.
Un ambiente comunemente creato è uno che racchiude il package:base
o un sub-ambiente all'interno del package:base
.
e1 <- new.env(parent = baseenv())
e2 <- new.env(parent = e1)
Le variabili possono essere assegnate e chiamate esplicitamente da o verso quegli ambienti.
assign("a", 3, envir = e1)
get("a", envir = e1)
get("a", envir = e2)
3
3
Poiché e2
eredita da e1
, a
è 3
sia in e1
che in e2
. Tuttavia, l'assegnazione di a
all'interno di e2
non modifica il valore di a
in e1
.
assign("a", 2, envir = e2)
get("a", envir = e2)
get("a", envir = e1)
3
2
Funzione Esci
La funzione on.exit()
è utile per la pulizia delle variabili se è necessario assegnare variabili globali.
Alcuni parametri, in particolare quelli per la grafica, possono essere impostati solo a livello globale. Questa piccola funzione è comune quando si creano trame più specializzate.
new_plot <- function(...) {
old_pars <- par(mar = c(5,4,4,2) + .1, mfrow = c(1,1))
on.exit(par(old_pars))
plot(...)
}
Pacchetti e mascheratura
Funzioni e oggetti in pacchetti diversi potrebbero avere lo stesso nome. Il pacchetto caricato in un secondo momento "maschera" il pacchetto precedente e verrà stampato un messaggio di avviso. Quando si chiama la funzione per nome, verrà eseguita la funzione del pacchetto caricato più recentemente. È possibile accedere esplicitamente alla funzione precedente.
library(plyr)
library(dplyr)
Allegare il pacchetto: 'dplyr'
I seguenti oggetti sono mascherati da "pacchetto: plyr":
organizzare, contare, desc, failwith, id, mutare, rinominare, riepilogare, riepilogare
I seguenti oggetti sono mascherati da "pacchetto: stats":
filtro, lag
I seguenti oggetti sono mascherati da "pacchetto: base":
intersecano, setdiff, setequal, unione
Quando si scrive codice, è sempre consigliabile chiamare in modo esplicito le funzioni utilizzando package::function()
specifico per evitare questo problema.