2016-07-06 3 views
0

Je viens juste d'apprendre en classe que R utilise le scannage lexical et l'a testé dans R Studio sur mon ordinateur et j'ai obtenu des résultats qui cadrent avec la dynamique, pas lexical. N'est-ce pas censé arriver en R? Je courus:Pourquoi mon R fonctionne-t-il en scoping dynamique? Ne devrait-il pas être lexical?

y <- 10 
f <- function(x) { 
    y <- 2 
    y^3 
} 
f(3) 

f (3) est sorti pour être 4 (2^3) non 100 (10^3), même si ma classe a présenté cette diapositive: http://puu.sh/pStxA/0545079dbe.png. N'est-ce pas une portée dynamique? Je peux juste regarder ceci mal, mais y a-t-il un mode sur un menu quelque part où vous pouvez passer le scoping au lexical, ou ce qui se produit?

+4

Vous devez travailler sur le formatage votre question et sur ce qui en fait une cohérence interne. (Vous utilisez cubed dans votre exemple de code et sqaured dans votre paragraphe.) En outre, vous pouvez utiliser RStudio comme éditeur de code, mais cette question concerne R, pas RStudio. Vous ne marqueriez pas une question de grammaire anglaise avec "Word" juste parce que vous utilisiez MS Word comme éditeur. – Gregor

+0

2^3 est 4 ??? 10^3 est 100 ??? Heureusement pour ma santé mentale R ne le pense pas non plus. –

Répondre

0

Votre code a assigné y dans la fonction elle-même, qui est recherchée avant y dans l'environnement global.

De cet excellent article (http://www.r-bloggers.com/environments-in-r/): "Lorsqu'une fonction est évaluée, R examine une série d'environnements pour toutes les variables de la portée L'environnement d'évaluation est d'abord, puis l'environnement englobant de la fonction, qui sera l'environnement global pour les fonctions définies dans l'espace de travail. " Dans un langage plus simple spécifique à votre cas: lorsque vous appelez la variable "y", R cherche "y" dans l'environnement de la fonction, et si elle ne parvient pas à en trouver un, il va dans votre espace de travail. Un exemple pour illustrer:

y <- 10 

f <- function(x) { 
    y^3 
} 

f(3) 

produira une sortie:

> f(3) 
[1] 1000 
+0

Notez également que la définition de y dans la fonction n'atteint pas la portée globale à moins que vous n'utilisiez l'opérateur d'affectation '<< -' au lieu de '<-' – Adam

+0

Okay. Donc j'ai pensé cela aussi, mais ma leçon a cette diapositive: http://puu.sh/pStxA/0545079dbe.png Est-ce juste incorrect alors? – Bethie

+0

Citant cette source (https://github.com/jtleek/modules/blob/master/02_RProgramming/Scoping/index.md): « portée lexicales R signifie que Les valeurs de FREE (mine d'importance) les variables sont recherchés dans l'environnement dans lequel la fonction a été définie. " Dans votre cas, y n'était pas une variable libre car vous avez affecté y <- 2 dans l'environnement de la fonction. – Anton