191 votes

Erreur : Impossible de trouver la fonction ... dans R

Il s'agit d'une question de type FAQ. Veuillez donc être aussi complet que possible. La réponse est une réponse communautaire, alors n'hésitez pas à la modifier si vous pensez qu'il manque quelque chose.

Cette question a été discutée et approuvée sur méta.

J'utilise R et j'ai essayé some.function mais j'ai reçu le message d'erreur suivant :

Error: could not find function "some.function"

Cette question revient très régulièrement. Lorsque vous obtenez ce type d'erreur dans R, comment pouvez-vous la résoudre ?

5 votes

Avant de voter pour clore cette question, lisez d'abord cette discussion sur la méta : meta.stackexchange.com/questions/101892/

2 votes

Si tout le reste échoue, essayez de parcourir le code source de la base R et de vos paquets installés.

3 votes

@nullglob Cela semble un peu extrême :-)

134voto

Joris Meys Points 38980

Il y a quelques éléments que vous devez vérifier :

  1. Avez-vous écrit le nom de votre fonction correctement ? Les noms sont sensibles à la casse.
  2. Avez-vous installé le paquet qui contient la fonction ? install.packages("thePackage") (cela ne doit être fait qu'une seule fois)
  3. Avez-vous attaché ce paquet à l'espace de travail ? require(thePackage) (et vérifier sa valeur de retour) ou library(thePackage) (ceci doit être fait à chaque fois que vous démarrez une nouvelle session R)
  4. Utilisez-vous une ancienne version de R où cette fonction n'existait pas encore ?

Si vous n'êtes pas sûr de savoir dans quel paquet se trouve cette fonction, vous pouvez faire plusieurs choses.

  1. Si vous êtes sûr d'avoir installé et attaché/chargé le bon paquet, tapez help.search("some.function") ou ??some.function pour obtenir une boîte d'information qui peut vous dire dans quel paquet il est contenu.
  2. find et getAnywhere peut également être utilisé pour localiser les fonctions.
  3. Si vous n'avez aucun indice sur le paquet, vous pouvez utiliser findFn dans le sos comme expliqué dans cette réponse .
  4. RSiteSearch("some.function") ou la recherche avec rdocumentation ou rseek sont des façons alternatives de trouver la fonction.

Parfois, vous devez utiliser une ancienne version de R, mais exécuter un code créé pour une version plus récente. Les fonctions nouvellement ajoutées (par exemple hasName dans R 3.4.0) ne seront alors pas trouvées. Si vous utilisez une ancienne version de R et souhaitez utiliser une fonction plus récente, vous pouvez utiliser le paquetage backports pour mettre ces fonctions à disposition. Vous trouverez également une liste des fonctions qui doivent être rétroportées sur le site Web de la Commission européenne. git repo des backports . N'oubliez pas que les versions de R antérieures à R3.0.0 sont incompatibles avec les paquets construits pour R3.0.0 et les versions ultérieures.

0 votes

Bonjour Joris, j'ai une petite question. Je suis nouveau dans R mais j'ai pu l'installer avec succès. Je voudrais utiliser la fonction "cosvol" du paquet "celestial" en ligne de commande. Contrairement à mon R qui est installé à partir du dépôt Fedora dans mon système Linux, j'ai téléchargé mon paquet "celestial" dans un répertoire différent dans mon "home". À chaque fois que je demande la fonction "cosvol()", le système me dit "Impossible de trouver la fonction "cosdistCoVol"". Je ne sais pas comment faire connaître à R mon directeur dans lequel toutes les fonctions sont téléchargées dans mon paquet "celestial" séparément. Votre aide est appréciée.

0 votes

Si la fonction se trouve dans l'une des bibliothèques de base de R, vous devrez peut-être la mettre à jour. Dans mon cas, j'essayais d'utiliser la fonction hasName fonction dans utils . Cependant, j'utilisais 3.3.1 et hasName n'a pas été introduit avant la version 3.4.0. Comme vous ne pouvez pas mettre à jour utils en tant que bibliothèque autonome, R/R Studio a dit que je n'avais aucune bibliothèque à mettre à jour.

0 votes

@mpag C'est parce que le paquet utils fait partie intégrante de la version R. Si vous utilisez RSiteSearch("hasName"), la première entrée est littéralement une référence au paquet backports qui rendra cette fonction disponible dans R 3.3.1. Voir aussi github.com/r-lib/backports pour plus d'informations. J'ai ajouté quelques informations pour ce cas, merci de me le signaler.

29voto

Gavin Simpson Points 72349

Un autre problème, en présence d'un NAMESPACE, est que vous essayez d'exécuter une fonction non exportée du package foo .

Par exemple (artificiel, je sais, mais) :

> mod <- prcomp(USArrests, scale = TRUE)
> plot.prcomp(mod)
Error: could not find function "plot.prcomp"

Tout d'abord, vous ne devriez pas appeler les méthodes S3 directement, mais supposons que plot.prcomp était en fait une fonction interne utile dans le paquet foo . Pour appeler une telle fonction si vous savez ce que vous faites, il faut utiliser la fonction ::: . Vous devez également connaître l'espace de nom dans lequel se trouve la fonction. Utilisation de getAnywhere() nous trouvons que la fonction est dans le paquet stats :

> getAnywhere(plot.prcomp)
A single object matching ‘plot.prcomp’ was found
It was found in the following places
  registered S3 method for plot from namespace stats
  namespace:stats
with value

function (x, main = deparse(substitute(x)), ...) 
screeplot.default(x, main = main, ...)
<environment: namespace:stats>

Nous pouvons donc maintenant l'appeler directement en utilisant :

> stats:::plot.prcomp(mod)

J'ai utilisé plot.prcomp juste à titre d'exemple pour illustrer le propos. Dans une utilisation normale, vous ne devriez pas appeler les méthodes S3 de cette façon. Mais comme je l'ai dit, si la fonction que vous voulez appeler existe (il peut s'agir d'une fonction utilitaire cachée, par exemple), mais qu'elle se trouve dans un fichier de type namespace R signalera qu'il ne peut pas trouver la fonction, à moins que vous ne lui indiquiez dans quel espace de noms chercher.

Comparez cela à ce qui suit : stats::plot.prcomp Ce qui précède échoue parce que si stats utilise plot.prcomp il n'est pas exporté de stats comme le dit justement l'erreur :

Erreur : 'plot.prcomp' n'est pas un objet exporté par 'namespace:stats'.

Ceci est documenté comme suit :

pkg::name renvoie la valeur du nom de la variable exportée dans l'espace de noms pkg, alors que pkg:::name renvoie la valeur du nom de la variable interne.

1 votes

merci - cela m'a sauvé après la mise à niveau vers R 3 pour could not find function "anova.lm" ... fixé avec l'appel stats:::anova.lm() au lieu de

0 votes

Bien que ce ne soit pas très pertinent, l'utilisation de ::: a été qualifiée d'erreur de conception et que :: est préférable. Impossible de trouver facilement la référence.

1 votes

@NelsonGon Avec tout le respect que je vous dois, :: et ::: sont différents et votre montage ne le fait pas travail ! Le site plot.prcomp() fonction n'est pas exporté depuis l'espace de noms stats, vous devez donc utiliser ::: .

12voto

Iterator Points 10485

Je peux généralement résoudre ce problème lorsqu'un ordinateur est sous mon contrôle, mais c'est plutôt une nuisance lorsque je travaille avec une grille. Lorsqu'une grille n'est pas homogène, toutes les bibliothèques peuvent ne pas être installées, et mon expérience m'a souvent montré qu'un paquet n'était pas installé parce qu'une dépendance n'était pas installée. Pour résoudre ce problème, je vérifie ce qui suit :

  1. Fortran est-il installé ? (Recherchez 'gfortran'.) Cela affecte plusieurs paquets majeurs de R.
  2. Java est-il installé ? Les chemins des classes Java sont-ils corrects ?
  3. Vérifiez que le paquet a été installé par l'administrateur et qu'il est disponible pour être utilisé par l'utilisateur approprié. Parfois, les utilisateurs installent les paquets au mauvais endroit ou les exécutent sans accès approprié aux bonnes bibliothèques. .libPaths() est une bonne vérification.
  4. Vérifiez ldd résultats pour R, pour être sûr des bibliothèques partagées
  5. Il est bon de lancer périodiquement un script qui charge simplement tous les paquets nécessaires et effectue quelques petits tests. Cela permet d'attraper le problème du paquet le plus tôt possible dans le flux de travail. Cela s'apparente à un test de construction ou à un test unitaire, sauf qu'il s'agit plutôt d'un test de fumée pour s'assurer que les choses très basiques fonctionnent.
  6. Si les paquets peuvent être stockés dans un emplacement accessible par le réseau, le sont-ils ? Si ce n'est pas le cas, existe-t-il un moyen d'assurer des versions cohérentes sur toutes les machines ? (Cela peut sembler être une erreur de programmation, mais l'installation correcte d'un paquet inclut la disponibilité de l'adresse IP de l'utilisateur. droite version).
  7. Le paquet est-il disponible pour le système d'exploitation donné ? Malheureusement, tous les paquets ne sont pas disponibles sur toutes les plateformes. Cela nous ramène à l'étape 5. Si possible, essayez de trouver un moyen de gérer un système d'exploitation différent en passant à une version appropriée d'un paquet ou en désactivant la dépendance dans certains cas.

Ayant rencontré ce problème assez souvent, certaines de ces étapes deviennent assez routinières. Bien que le numéro 7 puisse sembler être un bon point de départ, ces étapes sont énumérées dans l'ordre approximatif de la fréquence à laquelle je les utilise.

2 votes

Des considérations utiles, certes, mais plutôt une réponse à la question "Pourquoi est-ce que j'obtiens une erreur lors de l'installation d'un paquet".

0 votes

@DWin : Peut-être, mais pas vraiment. Je n'ai peut-être pas été clair. Ces problèmes surviennent lorsqu'un travail s'arrête sur une grille parce qu'un paquet n'a pas été installé. Maintenir la cohérence des logiciels sur une grille n'est pas difficile, mais nécessite un bon processus d'installation, de maintenance et de débogage. Ce ne sont là que quelques-uns des éléments qui ressortent de chaque phase, du moins en ce qui concerne le bruit de grincement qui se produit lorsqu'une fonction n'est pas disponible :)

6voto

Jacob Points 1

Si cela se produit lorsque vous vérifiez votre paquet (vérification R CMD), jetez un coup d'œil à votre NAMESPACE.

Vous pouvez résoudre ce problème en ajoutant l'instruction suivante au NAMESPACE :

exportPattern("^[^\\\\.]")

Ceci exporte tout ce qui ne commence pas par un point ("."). Cela vous permet d'avoir vos fonctions cachées, commençant par un point :

.myHiddenFunction <- function(x) cat("my hidden function")

0 votes

Cela échoue pour moi dans RStudio - Erreur : ' \. ' est un échappement non reconnu dans une chaîne de caractères commençant par ""^[^]". \. "

1 votes

Avez-vous des suggestions sur ce que je pourrais faire si j'obtiens l'erreur en utilisant un paquet que je n'ai pas écrit ? Le paquet lui-même semble vouloir utiliser une méthode interne qui n'est pas définie parce que l'auteur n'a probablement pas fait ce qui précède.

4voto

swihart Points 115

J'ai eu l'erreur

Erreur : Impossible de trouver la fonction some.function

se produisent lors de la vérification par R CMD d'un paquet que je faisais avec RStudio. J'ai trouvé l'ajout de

exportPattern(".")

au fichier NAMESPACE a fait l'affaire. En passant, j'avais initialement configuré RStudio pour utiliser ROxygen afin de créer la documentation - et j'avais sélectionné la configuration où ROxygen écrivait mon fichier NAMESPACE pour moi, ce qui effaçait mes modifications. Dans mon cas, j'ai donc décoché NAMESPACE de la configuration de Roxygen et ajouté exportPattern(".") à NAMESPACE pour résoudre cette erreur.

1 votes

Vous feriez mieux d'utiliser roxygen2, qui reconnaît les modifications que vous apportez aux fichiers de l'espace de nom et les garde intacts. Je vous déconseille également fortement d'utiliser exportPattern(".") dans le fichier namespace. Utilisez plutôt la balise @export dans vos fichiers individuels, afin de n'exporter que les fonctions qui doivent l'être. Roxygen2 mettra automatiquement à jour l'espace de noms pour exporter toutes les fonctions qui doivent être exportées.

1 votes

Joris - J'apprécie vraiment que vous preniez le temps de commenter ; je suis d'accord à 100% avec ce que vous avez écrit. J'utilise maintenant devtools/roxygen2 et je mets ce qui suit dans toutes les fonctions que je dois exporter : #' @export

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X