Désolé pour le titre, je ne parviens pas à faire un titre plus explicite.
Dans un gros programme, que ce soit un long code R, plusieurs fichier .R, une grosse appli shiny, ou tout autre utilisation de R créant de nombreux objets et fonctions il est parfois difficile (surtout lors de l'update quelques temps après) de se rappeler les dépendances, utilisations, caractéristiques et nécessités de tous les objets R. Pour l'instant j'utilise les commentaires pour expliciter chaque bloc de code et je les rend les plus indépendant possible. Mais je ne trouve pas ça optimal.
De fait je me pose la question s'il serait utile et safe d'utiliser les attributs des objets R pour stocker ces informations.
Code : Tout sélectionner
attributes(x) <- list(description="description de l'objet",
used=c("truc1", "toto"),
depends=c("machin", "f1()"), ...)
Avec microbenchmark et un tout petit test, la performance n'est pas impactée pour les quelques fonctions utilisées :
Code : Tout sélectionner
x <- runif(1e3)
y <- runif(1e3)
attributes(x) <- list(description="description de l'objet",
used=c("truc1", "toto"),
depends=c("machin", "f1()"))
f1 <- function() mean(x) + sum(x) + length(x)
f2 <- function() mean(y) + sum(y) + length(y)
microbenchmark::microbenchmark(f1(), f2(), times=100)
> Unit: microseconds
> expr min lq mean median uq max neval cld
> f1() 11.495 12.522 14.41892 13.549 13.959 76.772 100 a
> f2() 11.495 12.727 16.12667 13.548 13.959 266.444 100 a
Il reste le coté sécuritaire. Je ne connais pas bien les attributs, surtout ceux qui ne correspondent à rien (donc hors dim, dimnames, ...). Savez-vous si l'ajout d'attributs à certains objets R (vector, matrix, lists, functions) peut impacter quelque autre action que ce soit (stabilité d'une fonction, d'un objet, propagation des attributs non-voulue, changement de classe de l'input/output ...) ?
Si rien ne s'y oppose il pourrait ensuite être intéressant que les slots 'used' et 'depends' se remplissent automatiquement via une fonction dédiée, et donc une autre question est : savez-vous si une fonction de ce type existe ?
Bien sûr si vous avez des conseils/astuces pour la thématique hors usage des attributs ils sont les bienvenus !
Merci,
Bastien