143 votes

Variables globales et variables locales

Je suis un newbie pour R, et je suis tout à fait confondue avec l'utilisation des locaux et des variables globales dans R.

J'ai lu quelques posts sur internet que dire, si j'utilise = ou <- je vais attribuer à la variable dans l'environnement actuel, et avec <<- je peux accéder à une variable globale dans une fonction.

Cependant, comme je me souviens qu'en C++ variables locales surviennent lorsque vous déclarez une variable à l'intérieur des crochets {}, alors je me demandais si c'est la même chose pour la R? Ou est-ce juste pour les fonctions de R que nous avons la notion de variables locales.

J'ai fait une petite expérience, qui semble suggérer que seuls les supports ne sont pas assez, j'obtiens quelque chose de mal?

{
   x=matrix(1:10,2,5)
}
print(x[2,2])
[1] 4

165voto

betabandido Points 5542

Les Variables déclarées à l'intérieur d'une fonction sont locales à cette fonction. Par exemple:

foo <- function() {
    bar <- 1
}
foo()
bar

donne l'erreur suivante: Error: object 'bar' not found.

Si vous voulez faire de l' bar d'une variable globale, il convient de faire:

foo <- function() {
    bar <<- 1
}
foo()
bar

Dans ce cas - bar est accessible depuis l'extérieur de la fonction.

Cependant, contrairement au C, C++ ou plusieurs autres langues, les supports ne permettent pas de déterminer la portée des variables. Par exemple, dans l'extrait de code suivant:

if (x > 10) {
    y <- 0
}
else {
    y <- 1
}

y reste accessible après l' if-else déclaration.

Comme vous le dites, vous pouvez également créer des listes de milieux. Vous pouvez jeter un oeil à ces deux liens pour comprendre comment les utiliser:

  1. http://stat.ethz.ch/R-manual/R-devel/library/base/html/environment.html
  2. http://stat.ethz.ch/R-manual/R-devel/library/base/html/get.html

Vous avez ici un petit exemple:

test.env <- new.env()

assign('var', 100, envir=test.env)
# or simply
test.env$var <- 100

get('var') # var cannot be found since it is not defined in this environment
get('var', envir=test.env) # now it can be found

146voto

Dason Points 18263

<- 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"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X