Quel est votre style préféré pour nommer les variables dans R? [fermé]

110

Quelles conventions de nommage des variables et des fonctions préférez-vous dans le code R?

Pour autant que je sache, il existe plusieurs conventions différentes, qui coexistent toutes dans une harmonie cacophonique:

1. Utilisation du séparateur de périodes, par exemple

  stock.prices <- c(12.01, 10.12)
  col.names    <- c('symbol','price')

Avantages: a une priorité historique dans la communauté R, répandue dans tout le noyau R et recommandée par le guide de style R de Google .

Inconvénients: regorge de connotations orientées objet et déroutant pour les débutants en R.

2. Utilisation de traits de soulignement

  stock_prices <- c(12.01, 10.12)
  col_names    <- c('symbol','price')

Avantages: Une convention commune dans de nombreux langages de programmation; préféré par Hadley Wickham's Style Guide , et utilisé dans les packages ggplot2 et plyr.

Inconvénients: non utilisé historiquement par les programmeurs R; est mappé de manière ennuyeuse à l'opérateur '<-' dans Emacs-Speaks-Statistics (modifiable avec 'ess-toggle-underscore').

3. Utilisation de la capitalisation mixte (camelCase)

  stockPrices <- c(12.01, 10.12)
  colNames    <- c('symbol','price')

Avantages: semble avoir une large adoption dans plusieurs communautés linguistiques.

Inconvénients: a un précédent récent, mais pas utilisé historiquement (dans la base R ou dans sa documentation).

Enfin, comme si ce n'était pas assez déroutant, je dois souligner que le Guide de style de Google plaide pour la notation par points pour les variables, mais une capitalisation mixte pour les fonctions.

Le manque de style cohérent entre les packages R est problématique à plusieurs niveaux. Du point de vue du développeur, cela rend difficile la maintenance et l'extension du code des autres (en particulier lorsque son style est incompatible avec le vôtre). Du point de vue de l'utilisateur R, la syntaxe incohérente accentue la courbe d'apprentissage de R, en multipliant les façons dont un concept pourrait être exprimé (par exemple, cette fonction de conversion de date est-elle asDate (), as.date () ou as_date ()? Non, c'est comme. Date()).

Medriscoll
la source
1
Il y a aussi des cas de style Matlab alllowercasenoms de variables, et beaucoup de droits-de-la-équation des noms très courts ( x, y, etc.).
Richie Cotton
5
les traits de soulignement sont comme python, donc j'ai tendance à utiliser des traits de soulignement. ESS devrait être corrigé, c'est vraiment idiot.
Brendan OConnor
7
Il n'y a rien à réparer, il a une bascule pour cela. Mais le comportement par défaut consiste à interpréter un trait de soulignement comme un raccourci pour <- vous épargner une touche à appuyer. Donc, si vous publiez des variables avec des traits de soulignement (Salut, Hadley), vous forcez chaque utilisateur ESS à appuyer deux fois sur _ pour obtenir le comportement d'origine - ou pour avoir personnalisé leur configuration ESS. Je préfère toujours camelCase par un nouveau mille nautique.
Dirk Eddelbuettel
2
camelCase a aussi des problèmes, par exemple, le camel Case standard ImfDataTransformedou la version naturelle étendue IMFDataTransformedne sont pas aussi faciles à lire que mon TOGGLEcamelCase préféré: IMFdataTransformed...
PatrickT
1
Je vote pour clore cette question comme hors-sujet car les réponses sont forcément basées sur l'opinion.
Ben Bolker

Réponses:

81

Bonnes réponses précédentes donc juste un peu à ajouter ici:

  • les traits de soulignement sont vraiment ennuyeux pour les utilisateurs de l'ESS; étant donné que ESS est assez largement utilisé, vous ne verrez pas beaucoup de traits de soulignement dans le code créé par les utilisateurs d'ESS (et cet ensemble comprend un tas d'auteurs de R Core ainsi que de CRAN, en dépit d'exceptions comme Hadley);

  • les points sont également mauvais parce qu'ils peuvent être mélangés dans une simple distribution de méthode; Je crois avoir lu une fois des commentaires à cet effet sur l'une des listes R: les points sont un artefact historique et ne sont plus encouragés;

  • nous avons donc un vainqueur clair toujours debout dans le dernier tour: camelCase. Je ne sais pas non plus si je suis vraiment d'accord avec l'affirmation de «manque de précendant dans la communauté R».

Et oui: le pragmatisme et la cohérence l'emportent sur le dogme. Donc, tout ce qui fonctionne et est utilisé par des collègues et co-auteurs. Après tout, nous avons encore des espaces blancs et des accolades pour discuter :)

Dirk Eddelbuettel
la source
6
+1 Bien dit! [Si seulement l'équipe de base publiait un guide de style définitif; Je pense que cela donnerait plus de crédit à leur utilisation déjà implicite.]
Shane
1
Je pourrais juste me souvenir mal en raison de mon propre parti pris en faveur du cas mixte, mais je pense que c'est ce que RG a toujours utilisé lorsque je travaillais pour lui. Je pense que ce qui est bon pour RG est bon pour moi!
geoffjentry
Geoff: Pas une mauvaise règle à suivre :)
Dirk Eddelbuettel
2
Merci pour le pouce en l'air. Quant au «document de style canonique»: souhaiter le long n'en fait pas le cas, sinon je monterais sur des poneys roses. Peut-être que vous pouvez commencer par créer quelque chose, que vous pouvez coller sur le R Wiki et que nous éditons, adoptons et y adhérons tous. L'espoir est éternel, comme on dit ...
Dirk Eddelbuettel
1
@Dirk - Je prévois de commencer à me diriger vers un boyau de chameau en fonction de votre recommandation, mais je suis curieux de savoir pourquoi ?make.namessemble suggérer que les noms séparés par des points sont préférés?
David LeBauer
73

J'ai fait une enquête sur les conventions de dénomination qui sont réellement utilisées sur CRAN qui ont été acceptées dans le R Journal :) Voici un graphique résumant les résultats:

entrez la description de l'image ici

Il s'avère (pas de surprise peut-être) que lowerCamelCase était le plus souvent utilisé pour les noms de fonction et les noms de période séparés les plus souvent utilisés pour les paramètres. Utiliser UpperCamelCase, comme le préconise le guide de style R de Google, est cependant très rare, et il est un peu étrange qu'ils préconisent l'utilisation de cette convention de dénomination.

L'article complet est ici:

http://journal.r-project.org/archive/2012-2/RJournal_2012-2_Baaaath.pdf

Rasmus Bååth
la source
2
Comment se fait-il que les pourcentages ne totalisent pas 100%?
e9t
10
@ e9t Parce qu'un nom peut correspondre à de nombreuses convétions de dénomination. printcorrespond à toutes les conventions sauf UpperCamel et .OTHER_style.
Rasmus Bååth
Ce serait bien de mettre à jour ce document.
Samuel-Rosa le
34

Souligne tout le chemin! Contrairement à l'opinion populaire, il existe un certain nombre de fonctions dans la base R qui utilisent des traits de soulignement. Courez grep("^[^\\.]*$", apropos("_"), value = T)pour les voir tous.

J'utilise le style de codage officiel Hadley ;)

hadley
la source
1
C'est chouette! Je n'étais pas au courant de la fonction apropos avant. Cela renvoie 10 fonctions pour moi dans R 2.9.0; Je dirais à peine que c'est un cas convaincant. Quelle est votre justification pour les traits de soulignement lorsqu'ils sont clairement minoritaires pour R?
Shane
3
Et bien c'est 16 dans R 2.10.0, donc c'est une augmentation de 60% par version;) Je les aime surtout parce qu'ils me rappellent Ruby; camelCase me rappelle Java.
hadley
6
Hadley, mon cœur dit de soutenir votre insurrection soulignée, mais ma tête dit de respecter le standard de la communauté et de dire oui à camelCase. :( Mais peut-être que la cohérence de soi est tout ce qui compte.
medriscoll
5

J'aime camelCase quand le chameau fournit en fait quelque chose de significatif - comme le type de données.

dfProfitLoss, où df = dataframe

ou

vdfMergedFiles (), où la fonction prend un vecteur et crache un dataframe

Bien que je pense que _ ajoute vraiment à la lisibilité, il semble y avoir trop de problèmes avec l'utilisation de.-_ Ou d'autres caractères dans les noms. Surtout si vous travaillez dans plusieurs langues.

Robert
la source
3

Cela dépend de vos préférences personnelles, mais je suis le guide de style de Google car il est cohérent avec le style de l'équipe principale. Je n'ai pas encore vu de trait de soulignement dans une variable de base R.

Shane
la source
3

Comme je le souligne ici:

Comment la verbosité des identifiants affecte-t-elle les performances d'un programmeur?

il convient de garder à l'esprit à quel point vos noms de variables sont compréhensibles pour vos collègues / utilisateurs s'ils ne sont pas des locuteurs natifs ...

Pour cette raison, je dirais que les traits de soulignement et les points sont meilleurs que la capitalisation, mais comme vous le faites remarquer, la cohérence est essentielle dans votre script.

David Lawrence Miller
la source
2

Comme d'autres l'ont mentionné, les soulignements vont bousiller beaucoup de gens. Non, ce n'est pas verboten mais ce n'est pas particulièrement courant non plus.

L'utilisation de points comme séparateur devient un peu poilue avec les classes S3 et autres.

D'après mon expérience, il semble que beaucoup de mucks de haute qualité de R préfèrent l'utilisation de camelCase, avec une certaine utilisation de points et une poignée de soulignements.

Geoffjentry
la source
1

Habituellement, je renomme mes variables en utilisant un ix de traits de soulignement et une capitalisation mixte (camelCase). Les variables simples sont nommées à l'aide de traits de soulignement, exemple:

PSOE_votes -> nombre de voix pour le PSOE (groupe politique d'Espagne).

PSOE_states -> Catégoriel, indique l'état où le PSOE gagne {Aragon, Andalousie, ...)

PSOE_political_force -> Catégoriel, indique la position entre les groupes politiques du PSOE {premier, deuxième, troisième)

PSOE_07 -> Union des PSOE_votes + PSOE_states + PSOE_political_force à 2007 (h eader -> votes, états, position )

Si ma variable est le résultat d'une fonction appliquée dans une / deux variables, j'utilise une capitalisation mixte.

Exemple:

positionXstates <- xtabs (~ états + position, PSOE_07)

Calejero
la source
0

J'ai une préférence pour les capitales mixtes.

Mais j'utilise souvent des points pour indiquer quel est le type de variable:

mixedCapitals.mat est une matrice. mixedCapitals.lm est un modèle linéaire. mixedCapitals.lst est un objet de liste.

etc.

Jesse
la source