web-dev-qa-db-fra.com

Pourquoi y a-t-il deux opérateurs d'affectation, `<-` et` -> `dans R?

Je sais utiliser <- et ->, et là sontplusieursécritures sur la différence entre equals affectation et affectation de flèche, mais je ne sais pas quand préférer -> plus de <-.

Il semble que la communauté ait fusionné en utilisant <- pour affectation.

Ni Google R style-guide , ni Hadley Wickam tidyverse R style-guide ne mentionnent même pas -> dans la section d'affectation.

Je suis curieux de connaître les considérations de conception qui ont amené les développeurs S/S-PLUS à mettre dans la flèche droite l'opérateur d'affectation ->. Dans quel (s) paramètre (s) utiliser -> être considéré comme plus lisible (ou plus facile à taper) par rapport à <- ou =?

Je ne connais aucune autre langue qui permette la sémantique d'affectation correcte. Quelles langues ont inspiré R à cet égard?

Je recherche des réponses qui citent des livres/documents de conception précoce/manuels d'utilisation/listes de diffusion archivées ou d'autres références pour établir l'intention de l'auteur/concepteur S en insérant l'opérateur d'affectation de flèche vers l'avant.

43
Haleemur Ali

De la réponse à un exercice dans The New S Language (Becker, Chambers and Wilks 1988), via Google Books:

Lorsque vous tapez une expression longue uniquement pour vous rappeler à la fin que ce serait une bonne idée d'enregistrer le résultat, une flèche vers la droite vous permet d'effectuer une affectation sans retaper la ligne.

Cela suggère que les utilisateurs S travaillaient directement dans la console, sans capacités d'édition de ligne disponibles dans la plupart des environnements modernes REPL /environnements interactifs ...


Un peu d'archéologie: j'ai fouillé dans des sources fondamentales sur Google Livres. Il existe trois livres pertinents:

  • the Brown Book: S: An Interactive Environment for Data Analysis and Graphics R. A. Becker, J. M. Chambers (CRC Press, 1984)
  • Extension du système S , Becker et Chambers (Taylor et Francis, 1985)
  • the Blue Book: The New S Language Becker, Chambers and Wilks (Wadsworth et Brooks/Cole 1988, mais réédité en 2018 !! par CRC Press)

    1. Le Brown Book ne mentionne pas -> dans le texte principal:

enter image description here

mais il le fait en annexe:

enter image description here

  1. Extension du système S mentionne -> dans le texte principal:

enter image description here

Je ne peux pas chercher beaucoup dans le livre, donc -> pourrait également être mentionné quelque part en annexe.

  1. Le Livre bleu fait référence à la flèche droite, mais semble en fait avoir une faute de frappe:

enter image description here

J'interprète les passages rouges soulignés comme soutenant qu'il y a une faute de frappe dans la première ligne soulignée, qui devrait être -> plutôt que ← ...

Voici la capture d'écran de la réponse à l'exercice mentionnée ci-dessus:

enter image description here

Si vous voulez une copie du livre de 1985, vous pouvez l'obtenir pour 34,41 $ - ou 1070,99 $ (mais avec la livraison gratuite!) ...

enter image description here

49
Ben Bolker

Je ne peux pas spéculer sur les raisons pour lesquelles R autorise une affectation de gauche à droite. Et il est certainement vrai que la plupart langages de programmation (presque tous, en fait) n'effectuent que des affectations de droite à gauche.

Cela dit, R n'est pas entièrement autonome.

Je ne connais aucune autre langue qui permette la sémantique d'affectation correcte.

Je peux penser à au moins trois autres (familles de) langues qui le permettent:

  • Les langues d'assemblage effectuent souvent une affectation de gauche à droite; par exemple, la syntaxe AT&T influente écrit l'affectation comme ceci:

    movl $1, %eax
    

    Cela affecte la valeur 1 au registre EAX. (D'un autre côté, la syntaxe x86 d'Intel effectue une affectation de droite à gauche.)

  • L'opération STO ("magasin") de TI-BASIC est écrite comme suit:

    1→A
    
  • COBOL utilise plusieurs formes d'affectation de gauche à droite:

    MOVE 1 TO x
    ADD 2 TO x
    

    etc.

Je doute cependant que l’une de ces langues ait inspiré la syntaxe d’affectation de R. En revanche, le langage de programmation APL utilise l’affectation des flèches, et il est généralement admis que S (et donc indirectement R) s’inspire de that; mais APL effectue uniquement une affectation de droite à gauche (var ← value).

9
Konrad Rudolph

Je pense que c'est juste une question de préférence personnelle.

Bien que -> les tubes magrittr antérieurs, un cas d'utilisation récent est que -> peut être utilisé pour maintenir le débit de gauche à droite dans de tels tuyaux:

library(magrittr)
input %>% fun1 %>% fun2 -> result

En revanche, étant donné que <- est principalement utilisé, vous voudrez peut-être utiliser <- même dans ce cas.

L'argument pour <- est qu'il commence la ligne avec la valeur définie qui est un peu comme le but de l'instruction, en particulier si la variable de résultat est bien nommée, tandis que le côté droit est la mécanique et donc le détail est subordonné au résultat - et on aime commencer par un aperçu et ensuite entrer dans les détails plus tard. Ci-dessous, nous définissons le paramètre k. Qu'il s'agisse de 3 ou qu'il soit défini par une constante telle qu'elle est ici ou qu'une expression complexe semble accessoire au but de la déclaration.

k <- 3

Personnellement, je n'utilise jamais ->.

9
G. Grothendieck

R est censé avoir une syntaxe qui est assez naturelle pour exprimer les mathématiques. Il est intéressant de noter que -> est en fait une notation courante pour décrire certaines opérations sur les lignes élémentaires sur les matrices. Par exemple, s*R_i -> R_i serait utilisé pour désigner l'opération consistant à remplacer la ligne i par s fois la ligne i. Quelque chose comme 2*A[1,] -> A[1,] est parfaitement valide R. Je ne sais pas si ces considérations ont quelque chose à voir avec la décision de conception, mais cela montre que c'est un choix raisonnable pour un langage mathématique.

7
John Coleman