Utiliser une fonction S3 generic d'un autre package

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Utiliser une fonction S3 generic d'un autre package

Messagepar Gabriel Terraz » 28 Juil 2023, 07:42

Bonjour,

Dans un package que j'ai fait, j'ai créé une méthode pour la fonction générique predictors() du package caret.

Code : Tout sélectionner

predictors.baba <- function(x, ...){
  x # do some thing
 }


Je peux recréer la fonction dans mon package,

Code : Tout sélectionner

predictors <- function (x, ...)
 {
UseMethod("predictors")
}

mais cela engendrerait un conflit avec le package caret s'il est utilisé.

Je peux aussi ajouter caret dans "Imports", mais dans l'idéal j'aimerais ne pas du tout dépendre de ce package, l'utilisateur n'est pas forcément amené à en avoir besoin.

Je pourrais tous simplement créer une fonction générique d'un autre nom...

Finalement, est-ce qu'il est possible d'utiliser une fonction générique s'appelant predictors() sans dépendre du tout de caret mais que si l'utilisateur charge ce dernier, cela ne provoque pas de conflit ?

J'ai l'impression que non
Merci

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Utiliser une fonction S3 generic d'un autre package

Messagepar Logez Maxime » 03 Aoû 2023, 07:34

Bonjour,

Il y a quelque chose d'ambigu dans ce que tu cherches à faire. D'une part tu crées une fonction pour une classe d'objet dédiée à la fonction générique du package caret, mais dans le même temps tu ne veux pas importer le package parce que les utilisateurs n'en ont pas nécessairement besoin.
Je ne vois pas trop où est le problème. L'import (tout ou partie) ou la dépendance entre package sont plus que courants et nécessitent régulièrement d'installer des packages que l'utilisateur n'utilise pas autrement que par des fonctions qui font appellent à ces packages.
Concernant les conflits, je ne vois pas trop ou est le problème du moment que les fonctions qui ont le même nom font la même chose.
Dans tous les cas toutes les fonctions devraient être accessibles sans souci. Que ce soit en chargeant ton package, en chargeant ton package puis caret, en chargeant caret puis ton package, et ce même si après tu détaches un des deux packages.
Personnellement, pour m'éviter ce genre de choses, je resterai sur la première option, mais je ne vois pas de problème à la deuxième.

Cordialement,
Maxime

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Utiliser une fonction S3 generic d'un autre package

Messagepar Gabriel Terraz » 30 Aoû 2023, 13:17

Bonjour,
Merci pour ta réponse (je suis parti en vacance entre temps, d'où le délais me concernant !).

Je t'accorde que l'idée peut paraitre saugrenue, mais l'idée générale est d'avoir un package qui soit une boîte à outil pour de nombreuses utilisations différentes.
Pour cette raison, la volonté est d'avoir le minimum de package importé, ils sont (presque) tous en suggest et selon les fonctions appelées, il faut bien évidement avoir le package correspondant. De cette manière, un utilisateur qui utilise une seule fonction n'a pas à installer toutes les dépendances qui ne lui serviront pas.
Je ne sais pas si c'est la meilleure stratégie, il aurait été possible aussi de splitter en plusieurs packages, par "thème".

En ce qui concerne la question posée sur la fonction predictors, certains utilisateurs ont l'habitude de l'utiliser via le package caret, d'où la volonté de conserver le nom mais en même temps, d'autres personnes qui n'utiliseraient pas caret aurait besoin qu'elle soit fournie.

Là ou je pensait que cela pourrait poser problème, serait si l'utilisateur charge caret, puis mon package, et ensuite ferait appel à predict() avec une méthode du package caret, est-ce que cela ne pose pas de problème à ce moment là ?

Merci d'avoir pris le temps de répondre

gabriel

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Utiliser une fonction S3 generic d'un autre package

Messagepar Logez Maxime » 01 Sep 2023, 09:29

Bonjour,
Gabriel Terraz a écrit :Là ou je pensait que cela pourrait poser problème, serait si l'utilisateur charge caret, puis mon package, et ensuite ferait appel à predict() avec une méthode du package caret, est-ce que cela ne pose pas de problème à ce moment là ?

Tu as raison, ça poserait problème parce que dans ce cas là, ta fonction générique n'irait pas chercher les fonctions predictors.classe parce qu'elles ne sont pas exportées depuis caret. Peut-être que le plus simple c'est de faire comme le package dplyr quand plyr a été chargé au préalable : mettre un message d'avertissement au lancement de ton package pour dire que si les utilisateurs veulent utiliser à la fois caret et ton package ils doivent d'abord charger ton package puis caret. Il doit falloir aussi déclarer dans ton NAMESPACE que tes fonctions sont des methodes s3 pour predictors et les exporter, S3method(predictors, predictors.xxx) export(predictors.xxx).

Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité