Je suis une piètre développeuse de code, je ne crée quasiment jamais de fonctions, je me contente d’utiliser celles que font les autres, et qui sont dans les packages. Mais parfois (rarement) il m’est nécessaire de modifier une fonction pour qu’elle réponde très exactement à mon besoin.
Dans cet article, je vais donc vous montrer un petit hack pour obtenir et modifier le code d’une fonction existante.
Lorsqu’on utilise la fonction or_plot()
du package finalfit
, par défaut, le plot créé comporte un titre en haut de celui-ci :
library(finalfit)
explanatory = c("age.factor", "sex.factor", "obstruct.factor", "perfor.factor")
dependent = 'mort_5yr'
colon_s %>%
or_plot(dependent, explanatory)
Or, le client pour lequel j’ai fait ce graphique, ne souhaitait pas que ce titre soit présent.
En regardant l’aide de la page, sur le coup, je n’ai pas compris comment supprimer ce titre, en utilisant les différents arguments.
?or_plot
J’ai donc sorti l’artillerie lourde 😁 : j’ai ouvert le code de la fonction pour voir si je pouvais facilement le modifier….
Pour obtenir le code d’une fonction appartenant à n’importe quel package (à condition qu’il soit ouvert), il vous suffit d’employer la fonction getAnywhere()
, comme ceci :
getAnywhere("or_plot")
Le code est alors fourni en output dans la console :
J’ai alors copié collé le code de la fonction dans un fichier.R que j’ai nommé my_or_plot
.
Remarque : dans la sortie il y a quelques lignes avant et après le code de la fonction, qu’il ne faut pas copier-coller.
En parcourant les lignes de code, j’ai vu, à la fin de la fonction, des lignes qui étaient relatives au titre. Et en tâtonnant un peu, j’ai compris que je pourrais ne pas afficher le texte en haut du graph, en passant les deux dernières lignes en commentaire, et en fermant la parenthèse en ligne 101.
J’ai alors enregistré ces modifications.
Pour cela, j’ai commencé par charger la fonction modifiée dans R (j’avais sauvé le fichier my_or_plot.R
à la racine de mon projet R), avec les commandes suivantes :
source("my_or_plot.R")
Puis je l’ai utilisé à la place de la fonction or_plot()
originale. J’ai commencé par obtenir un message d’erreur qui m’indiquait qu’il était impossible de trouver la fonction ggplot()
. J’ai alors ajouté l’ouverture du package ggplot2
avec la commande library(ggplot) :
library(ggplot2)
colon_s %>%
my_or_plot(dependent, explanatory)
Et j’ai bien obtenu mon graph sans titre !✌
Une fois la modification du code réalisée, je me suis rendu compte qu’en fait, il était possible de supprimer le titre en utilisant les arguments dependent_label = ""
et suffix=""
.
colon_s %>%
or_plot(dependent, explanatory, dependent_label = "",suffix="" )
Le bon côté des choses, c’est que cela m’a donné l’opportunité d’écrire cet article 😁
Et j’espère qu’il sera utile à nombre des lecteurs de ce blog.
Si cet article vous a plu, ou vous a été utile, et si vous le souhaitez, vous pouvez soutenir ce blog en faisant un don sur sa page Tipeee
Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.
2 réponses
Bel exemple de hacking, qui permet de fouiller et d’adapter un code. Donc un article bien utile.
Sur le plan graphique, je suis partisan de laisser le client adapter la figure à ses besoins. Le titre doit être effacé, placé à gauche, avec une police plus grande, le titre de l’axe avec une police plus petite… Travaillant dans un labo de recherche public, ce temps n’est pas facturé. Je préfère rendre une figure PDF qui pourra être éditée avec Inkscape par exemple et passer à l’analyse suivante… ou apprendre en lisant ton blog 😉
Bonjour
Il est possible d’externaliser ces propres fonctions d’une façon similaire. Cela a l’avantage d’améliorer et alléger le script principal et de pouvoir les rendre utilisables comme celles d’un package chargé. Autre point cela permet de faire appel à des fonctions dont le code n’apparaîtra pas dans le script Rmarkdown. Certaines fonctions demandent beaucoup de recherche et de développement et parfois leur utilisation ne doit pas rendre le code accessible pour autant.