J'ai créé un script utilitaire R, util.R, que je souhaite utiliser à partir d'autres scripts de mon projet. Quelle est la bonne façon de garantir que la fonction définie par ce script est disponible pour fonctionner dans mes autres scripts?
Je recherche quelque chose de similaire à la require
fonction, qui ne charge un package que s'il n'a pas encore été chargé. Je ne veux pas appeler source("util.R")
car cela chargera le script à chaque fois qu'il sera appelé.
Je sais que j'obtiendrai des réponses me disant de créer un package, comme dans Organizing R Source Code :) Mais je ne crée pas quelque chose qui sera utilisé ailleurs, c'est juste un projet autonome.
Réponses:
Voici un moyen possible. Utilisez la
exists
fonction pour rechercher quelque chose d'unique dans votreutil.R
code.Par exemple:
(Modifié pour inclure
mode="function"
, comme Gavin Simpson l'a souligné)la source
exists()
- doit êtremode = "function"
ajouté pour le rendre infaillibleexists()
semble lancer une erreur sauf d'en renvoyer une dans R 3.0.2.Il n'y a pas une telle chose intégrée, puisque R ne suit pas les appels vers
source
et n'est pas capable de déterminer ce qui a été chargé à partir d'où (ce n'est pas le cas lors de l'utilisation de packages). Pourtant, vous pouvez utiliser la même idée que dans les.h
fichiers C , c'est-à-dire envelopper le tout dans:la source
source("util.R")
dans leif
code, non?Say
util.R
produit une fonctionfoo()
. Vous pouvez vérifier si cette fonction est disponible dans l'environnement global et générer le script si ce n'est pas le cas:Cela trouvera n'importe quoi avec le nom
foo
. Si vous voulez trouver une fonction, alors (comme mentionné par @Andrie)exists()
est utile mais doit être dit exactement quel type d'objet rechercher, par exempleVoici
exists()
en action:la source
grepl(..., value=TRUE)
parce que votre terme de recherche n'est probablement pas une expression régulière. +1, au fait.grepl()
n'a pas d'argumentvalue
, mais je devrais probablement corriger l'expression rationnelle dansls()
...fixed=TRUE
exists()
c'est mieux mais je vois maintenant que vous avez posté une telle réponse entre-temps.Vous pouvez écrire une fonction qui prend un nom de fichier et un nom d'environnement, vérifie si le fichier a été chargé dans l'environnement et utilise
sys.source
pour trouver le fichier sinon.Voici une fonction rapide et non testée (améliorations bienvenues!):
la source
Voici une fonction que j'ai écrite. Il encapsule la
base::source
fonction pour stocker une liste de fichiers source dans une liste d'environnement global nomméesourced
. Il ne re-source un fichier que si vous fournissez un.force=TRUE
argument à l'appel à la source. Sa signature d'argument est par ailleurs identique au réelsource()
, vous n'avez donc pas besoin de réécrire vos scripts pour l'utiliser.C'est assez bavard (beaucoup d'appels à
message()
), vous pouvez donc supprimer ces lignes si vous vous en souciez. Tout conseil des utilisateurs vétérans de R est apprécié; Je suis assez nouveau chez R.la source
J'ai résolu mon problème en utilisant l'adresse entière où mon code est: Avant:
Après:
la source