Hacker le code d'une fonction existante

obtenir et modifier le code d'une fonction

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.

Un problème rencontré très récemment

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) 
plot odds ratio

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 
page d'aide de la fonction 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….

Obtenir et modifier le code source d’une fonction

Obtenir le code avec la fonction getAnywhere

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 :

Début du code de la fonction or_plot()

Copier le code source dans un fichier.R

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.

copier coller le code dans un fichier.R

Modifier le code

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.

modification du code

J’ai alors enregistré ces modifications.

Utilisation du code modifié

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 !✌

plot sans le titre

La fin de l'histoire

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 🙏

Image par Elchinator de Pixabay

Poursuivez votre lecture

2 réponses

  1. 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 😉

  2. 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

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.