La différence entre opérateurs d'affectation est plus clair lorsque vous les utilisez pour définir la valeur d'un argument dans un appel de fonction. Par exemple :
median(x = 1:10)
x
## Error: object 'x' not found
Dans ce cas, x
est déclarée dans la portée de la fonction, elle n'existe donc pas dans l'espace de travail de l'utilisateur.
median(x <- 1:10)
x
## [1] 1 2 3 4 5 6 7 8 9 10
Dans ce cas, x
est déclaré dans l'espace de travail de l'utilisateur, de sorte que vous pouvez l'utiliser après l'appel de la fonction.
Il y a une préférence générale parmi la communauté R pour l'utilisation de <-
pour l'affectation (autre que dans les signatures de fonctions) pour la compatibilité avec les (très) anciennes versions de S-Plus. Notez que les espaces aident à clarifier des situations comme
x<-3
# Does this mean assignment?
x <- 3
# Or less than?
x < -3
La plupart des IDE de R ont des raccourcis clavier pour rendre <-
plus facile à taper. Ctrl + = en tant qu'architecte, Alt + - dans RStudio ( Option + - sous macOS), Shift + - (underscore) dans emacs+ESS.
Si vous préférez écrire =
a <-
mais que vous souhaitez utiliser le symbole d'affectation plus courant pour le code publié publiquement (sur CRAN, par exemple), vous pouvez utiliser l'un des symboles suivants tidy_*
fonctions dans le formatR
pour remplacer automatiquement =
con <-
.
library(formatR)
tidy_source(text = "x=1:5", arrow = TRUE)
## x <- 1:5
La réponse à la question "Pourquoi x <- y = 5
lancer une erreur mais pas x <- y <- 5
?" est "C'est dû à la magie contenue dans l'analyseur syntaxique". La syntaxe de R contient de nombreux cas ambigus qui doivent être résolus d'une manière ou d'une autre. L'analyseur syntaxique choisit de résoudre les bits de l'expression dans des ordres différents selon que =
o <-
a été utilisé.
Pour comprendre ce qui se passe, vous devez savoir que l'affectation renvoie silencieusement la valeur qui a été affectée. Vous pouvez voir cela plus clairement en imprimant explicitement, par exemple print(x <- 2 + 3)
.
Deuxièmement, il est plus clair d'utiliser la notation préfixe pour l'affectation. Ainsi,
x <- 5
`<-`(x, 5) #same thing
y = 5
`=`(y, 5) #also the same thing
L'analyseur interprète x <- y <- 5
comme
`<-`(x, `<-`(y, 5))
On peut s'attendre à ce que x <- y = 5
serait alors
`<-`(x, `=`(y, 5))
mais en fait, il est interprété comme
`=`(`<-`(x, y), 5)
Cela s'explique par le fait que =
a une priorité inférieure à celle de <-
comme indiqué sur le ?Syntax
page d'aide.
62 votes
Comme indiqué aquí les origines de la
<-
proviennent de vieux claviers APL qui avaient en fait un seul symbole<-
sur eux.