<-
ne affectation dans l'environnement actuel.
Lorsque vous êtes à l'intérieur d'une fonction R crée un nouvel environnement pour vous. Par défaut, il comprend tout, de l'environnement dans lequel il a été créé de sorte que vous pouvez utiliser ces variables en tant que bien, mais quelque chose de nouveau que vous créez sera pas obtenir de l'écrit à l'environnement mondial.
Dans la plupart des cas <<-
à attribuer aux variables déjà dans l'environnement mondial ou créer une variable dans l'environnement global, même si vous êtes à l'intérieur d'une fonction. Cependant, il n'est pas aussi simple que ça. Ce qu'il fait est vérifications de l'environnement actuel pour une variable du nom de l'intérêt. Si il ne le trouve pas dans votre environnement actuel, il va à la mère de l'environnement (à la fois la fonction a été créé) et regarde là. Il continue à la hausse pour l'environnement mondial et si elle n'est pas trouvée dans l'environnement global, il va attribuer à la variable dans l'environnement mondial.
Cela pourrait illustrer ce qui se passe.
bar <- "global"
foo <- function(){
bar <- "in foo"
baz <- function(){
bar <<- "in baz"
}
print(bar)
baz()
print(bar)
}
bar
#[1] "global"
foo()
#[1] "in foo"
#[1] "in baz"
bar
#[1] "global"
La première fois que nous avons l'impression bar, nous n'avons pas appelé foo
encore donc il devrait encore être global - ce qui a du sens. La deuxième fois, nous avons l'impression qu'il y a à l'intérieur de l' foo
avant d'appeler baz
de sorte que la valeur "toto" a du sens. La suite est là que nous voyons ce qu' <<-
est en train de faire: une Fois que nous appelons baz
de la copie de bar à l'intérieur de l' foo
est changé à "baz" mais comme nous pouvons le voir le global bar est inchangé. Donc, <<-
n'est pas seulement d'assigner directement à l'environnement mondial.
<<-
est délicat et je ne vous recommande pas de l'utiliser si vous pouvez l'éviter. Si vraiment vous souhaitez affecter à l'environnement planétaire, vous pouvez utiliser l'assigner la fonction et le dire explicitement que vous souhaitez affecter à l'échelle mondiale.
Maintenant j'ai changer l' <<-
d'affecter déclaration et nous pouvons voir l'effet que ça a:
bar <- "global"
foo <- function(){
bar <- "in foo"
baz <- function(){
assign("bar", "in baz", envir = .GlobalEnv)
}
print(bar)
baz()
print(bar)
}
bar
#[1] "global"
foo()
#[1] "in foo"
#[1] "in foo"
bar
#[1] "in baz"
Donc, les deux fois nous avons l'impression bar à l'intérieur de l' foo
la valeur est "foo" même après l'appel de baz
. Cependant, cette fois la valeur de barre dans l'environnement mondial a été changé parce que nous avons explicitement attribuées.
Maintenant, vous aussi posé des questions sur la création de variables locales et vous pouvez le faire assez facilement aussi bien sans la création d'une fonction... Nous avons juste besoin d'utiliser l' local
fonction.
bar <- "global"
# local will create a new environment for us to play in
local({
bar <- "local"
print(bar)
})
#[1] "local"
bar
#[1] "global"