46 votes

Quels sont les logiciels de base qu'un développeur R professionnel doit posséder, et pourquoi ?

Quels sont les utilitaires spécifiques qui peuvent aider les développeurs R à coder et à déboguer plus efficacement ?

Je cherche à mettre en place un environnement de développement R, et j'aimerais avoir une vue d'ensemble des outils qui me seraient utiles pour créer une infrastructure de tests unitaires avec couverture de code, débogage, génération de fichiers de paquets et de fichiers d'aide et peut-être modélisation UML.

Remarque : Veuillez justifier vos réponses par des raisons et des exemples basés sur votre expérience avec les outils que vous recommandez. Ne vous contentez pas d'un lien .

En rapport

50voto

hadley Points 33766

J'ai écrit beaucoup trop de paquets, alors pour garder les choses gérables, j'ai investi beaucoup de temps dans les paquets d'infrastructure : des paquets qui m'aident à rendre mon code plus robuste et à le rendre plus facile à utiliser pour les autres. Ces paquets sont les suivants :

  • roxygen2 (avec Manuel Eugster et Peter Danenberg), qui vous permet de conserver la documentation à côté de la fonction qu'elle documente, ce qui rend beaucoup plus probable le fait que je la tienne à jour. roxygen2 dispose également d'un certain nombre de nouvelles fonctionnalités conçues pour minimiser la duplication de la documentation : les modèles ( @template ), l'héritage des paramètres ( @inheritParams ) et les familles de fonctions ( @family ), pour n'en citer que quelques-uns.

  • testthat automatise les tests de mon code. Cela devient de plus en plus important car j'ai de moins en moins de temps pour coder : les tests automatisés se souviennent de la manière dont la fonction doit fonctionner, même si je ne le fais pas.

  • devtools automatise de nombreuses tâches de développement courantes (comme l'a mentionné Andrie). L'objectif final pour devtools est qu'il se comporte comme un R CMD check qui fonctionne en permanence en arrière-plan et vous avertit en cas de problème.

  • profr , en particulier l'inédit explorateur interactif Il est donc facile pour moi de trouver les goulots d'étranglement dans mon code.

  • helpr (avec Barret Schloerke), qui alimentera bientôt le site web de la http://had.co.nz/ggplot2 fournit une interface html élégante pour la documentation de R.

Fonctions R utiles :

  • apropos : J'oublie toujours les noms des fonctions utiles, et apropos m'aide à les retrouver, même si je ne me souviens que d'un fragment

En dehors de R :

  • J'utilise textmate pour éditer les fichiers R (et autres), mais je ne pense pas que ce soit vraiment important. Choisissez-en un et apprenez-en tous les recoins.

  • Prenez le temps d'apprendre à utiliser la ligne de commande. Tout ce que vous pouvez faire pour automatiser une partie de votre flux de travail sera payant à long terme. L'exécution de R à partir de la ligne de commande conduit à un processus naturel où chaque projet a sa propre instance de R ; j'ai souvent 2 à 5 instances de R en cours d'exécution à la fois.

  • Utiliser le contrôle des versions. J'aime git y github . Encore une fois, le système que vous utilisez n'a pas d'importance, mais maîtrisez-le !

Les choses que j'aimerais que R ait :

  • les outils de couverture du code
  • un cadre de gestion des dépendances comme rake ou jake
  • de meilleurs outils de profilage de la mémoire
  • une norme de métadonnées pour décrire les cadres de données (et autres sources de données)
  • de meilleurs outils pour la description et le rendu des tableaux dans une variété de formats de sortie
  • un paquet pour le rendu de markdown

46voto

Dirk Eddelbuettel Points 134700

Je me souviens de ce qui a été demandé avant et ma réponse reste la même: Emacs.

Emacs peut

  • faire à peu près tout ce que vous voulez faire avec R grâce à l'ESS, y compris
    • code de l'exécution des différents extraits (la ligne, la région, la fonction de tampon, ...)
    • l'inspection des espaces de travail,
    • affichage des variables,
    • plusieurs R de séances et de passer facilement entre eux
    • transcription de la mode pour en ré-exécutant (parties de) sessions précédentes
    • accès au système d'aide
    • et beaucoup plus
  • poignées de Latex avec la même facilité via le mode AucTex, qui permet de Sweave pour R
  • a modes selon d'autres langages de programmation que vous les combinez avec R, que ce soit en C/C++, Python, shell, SQL, ... couvrant automatique de l'indentation et de la couleur de surbrillance
  • pouvez accéder à des bases de données avec sql* mode
  • peuvent travailler à distance avec des débris de mode: accéder à des fichiers distants comme s'ils étaient locaux (utilise ssh/scp)
  • peut être exécuté comme un démon qui le rend dynamique de sorte que vous pouvez vous reconnecter à votre même session Emacs, que ce soit sur le poste de travail sous X11 (ou l'équivalent) ou à distance via ssh (avec ou sans X11) ou de l'écran.
  • a org-mode, qui, ensemble, avec babel, fournit un puissant sweave alternative, comme discuté dans ce document de discuter de flux de travail apps pour (sociale) des scientifiques
  • pouvez exécuter un shell par l' M-x shell et/ou M-x eshell, a nice répertoire de l'accès à la fonctionnalité de mode dired, a ssh mode d'accès à distance
  • les interfaces de tous les dépôts de code source avec facilité via des modes spécifiques (par exemple psvn pour svn)
  • est multi-plateforme comme R si vous avez semblable à une interface utilisateur expériences sur tous les systèmes d'exploitation
  • est largement utilisé, largement disponibles et en cours de développement, pour à la fois le code et les extensions, voir la emacswiki.org site pour le dernier
  • <tongueInCheek>n'est pas de l'Éclipse et ne nécessite pas de Java</tongueInCheek>

Vous pouvez bien sûr combiner avec n'importe quel CRAN paquets que vous aimez: RUnit ou testthat, les différents profilage de soutien des paquets, le paquet de débogage, ...

Des outils supplémentaires qui sont utiles:

  • R CMD check est vraiment votre ami, c'est ce que l'CRAN utilise pour décider si vous êtes "ou de"; de l'utiliser et de confiance en elle
  • l' tests/ répertoire peut offrir une version simplifiée de tests unitaires à l'économie d'être comparées à la sortie (à partir d'un avant R CMD check exécuté), c'est utile mais bon les tests unitaires sont mieux
  • en particulier pour les colis avec le code objet, je préfère lancer des frais de R sessions et littler qui facile: r -lfoo -e'bar(1, "ab")' commence une session R, charge le foo package et évalue l'expression donnée (ici une fonction bar() avec deux arguments). Ceci, combiné avec R CMD INSTALL, fournit un cycle d'essai complet.

9voto

Gavin Simpson Points 72349

La connaissance et la capacité à utiliser les outils de débogage de base de R est une première étape essentielle dans l'apprentissage du débogage rapide du code R. Si vous savez comment utiliser les outils de base, vous pouvez déboguer du code n'importe où sans avoir besoin de tous les outils supplémentaires fournis dans les packages d'extension.

traceback() permet de voir la pile d'appels menant à une erreur

foo <- function(x) {
    d <- bar(x)
    x[1]
}
bar <- function(x) {
    stopifnot(is.matrix(x))
    dim(x)
}
foo(1:10)
traceback()

les rendements :

> foo(1:10)
Error: is.matrix(x) is not TRUE
> traceback()
4: stop(paste(ch, " is not ", if (length(r) > 1L) "all ", "TRUE", 
       sep = ""), call. = FALSE)
3: stopifnot(is.matrix(x))
2: bar(x)
1: foo(1:10)

Nous pouvons donc voir clairement que l'erreur s'est produite dans la fonction bar() ; nous avons réduit le champ de la chasse aux bugs. Mais que se passe-t-il si le code génère des avertissements et non des erreurs ? Cela peut être géré en transformant les avertissements en erreurs via l'option warn option :

options(warn = 2)

transformera les avertissements en erreurs. Vous pouvez alors utiliser traceback() pour les retrouver.

Il s'agit également de faire en sorte que R se remette d'une erreur dans le code afin de pouvoir déboguer ce qui n'a pas fonctionné. options(error = recover) nous fera entrer dans un cadre de débogage chaque fois qu'une erreur sera soulevée :

> options(error = recover)
> foo(1:10)
Error: is.matrix(x) is not TRUE

Enter a frame number, or 0 to exit   

1: foo(1:10)
2: bar(x)
3: stopifnot(is.matrix(x))

Selection: 2
Called from: bar(x)
Browse[1]> x
 [1]  1  2  3  4  5  6  7  8  9 10
Browse[1]> is.matrix(x)
[1] FALSE

Vous voyez, nous pouvons aller dans chaque cadre de la pile d'appels et voir comment les fonctions ont été appelées, quels sont les arguments, etc. Dans l'exemple ci-dessus, nous voyons que bar() a reçu un vecteur et non une matrice, d'où l'erreur. options(error = NULL) rétablit ce comportement à la normale.

Une autre fonction clé est trace() qui permet d'insérer des appels de débogage dans une fonction existante. L'avantage est que vous pouvez demander à R de déboguer à partir d'une ligne particulière du code source :

> x <- 1:10; y <- rnorm(10)
> trace(lm, tracer = browser, at = 10) ## debug from line 10 of the source
Tracing function "lm" in package "stats"
[1] "lm"
> lm(y ~ x)
Tracing lm(y ~ x) step 10 
Called from: eval(expr, envir, enclos)
Browse[1]> n ## must press n <return> to get the next line step
debug: mf <- eval(mf, parent.frame())
Browse[2]> 
debug: if (method == "model.frame") return(mf) else if (method != "qr") warning(gettextf("method = '%s' is not supported. Using 'qr'", 
    method), domain = NA)
Browse[2]> 
debug: if (method != "qr") warning(gettextf("method = '%s' is not supported. Using 'qr'", 
    method), domain = NA)
Browse[2]> 
debug: NULL
Browse[2]> Q
> untrace(lm)
Untracing function "lm" in package "stats"

Cela vous permet d'insérer les appels de débogage au bon endroit dans le code sans avoir à passer par les appels de fonctions qui suivent.

Si vous souhaitez parcourir une fonction au fur et à mesure de son exécution, alors debug(foo) activera le débogueur pour la fonction foo() , tandis que undebug(foo) désactivera le débogueur.

Un point essentiel de ces options est que je n'ai pas eu besoin de modifier/éditer le code source pour insérer des appels de débogage, etc. Je peux essayer des choses et voir quel est le problème directement à partir de la session où l'erreur s'est produite.

Pour une approche différente du débogage en R, voir l'article de Mark Bravington intitulé débogage sur le CRAN

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