191 votes

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

Ceci est censé être une question FAQ, alors veuillez être aussi complet que possible. La réponse est une réponse communautaire, donc n'hésitez pas à éditer si vous pensez quelque chose manque.

Cette question a été discutée et approuvée sur meta.

I am using R and tried some.function but I got following error message:

Error: could not find function "some.function"

This question comes up very regularly. When you get this type of error in R, how can you solve it?

5 votes

Avant de voter pour fermer cette question, lisez d'abord cette discussion sur Meta : meta.stackexchange.com/questions/101892/…

2 votes

Si tout le reste échoue, essayez de rechercher dans le code source pour R de base et vos packages installés

3 votes

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

134voto

Joris Meys Points 38980

Il y a quelques choses que vous devriez vérifier :

  1. Avez-vous écrit le nom de votre fonction correctement? Les noms sont sensibles à la casse.
  2. Avez-vous installé le package qui contient la fonction? install.packages("lePackage") (cela doit être fait une seule fois)
  3. Avez-vous attaché ce package à l'espace de travail ? require(lePackage) (et vérifiez sa valeur de retour) ou library(lePackage) (cela 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?
  5. Utilisez-vous une version différente du package spécifique ? Cela peut aller dans les deux sens : des fonctions sont ajoutées et supprimées au fil du temps, et il est possible que le code auquel vous faites référence s'attende à une version plus récente ou plus ancienne du package que celle que vous avez installée.

Si vous n'êtes pas sûr dans quel package se trouve cette fonction, vous pouvez faire quelques choses.

  1. Si vous êtes sûr d'avoir installé et attaché/chargé le bon package, tapez help.search("some.function") ou ??some.function pour obtenir une boîte d'information qui peut vous dire dans quel package elle est contenue.
  2. find et getAnywhere peuvent également être utilisés pour localiser des fonctions.
  3. Si vous n'avez aucune idée du package, vous pouvez utiliser findFn dans le package sos comme expliqué dans cette réponse.
  4. RSiteSearch("some.function") ou rechercher avec rdocumentation ou rseek sont d'autres moyens de trouver la fonction.

Parfois, vous avez besoin d'utiliser une ancienne version de R, mais d'exécuter du code créé pour une version plus récente. Les fonctions nouvellement ajoutées (par exemple hasName dans R 3.4.0) ne seront pas trouvées. Si vous utilisez une ancienne version de R et que vous voulez utiliser une fonction plus récente, vous pouvez utiliser le package backports pour rendre ces fonctions disponibles. Vous trouverez également une liste des fonctions nécessitant d'être backportées sur le dépôt git de backports. Gardez à l'esprit que les versions de R antérieures à R3.0.0 sont incompatibles avec les packages construits pour R3.0.0 et les versions ultérieures.

0 votes

Salut Joris, j'ai une question rapide. Je suis nouveau en R mais j'ai réussi à l'installer avec succès. J'aimerais utiliser la fonction "cosvol" dans le package "celestial" en ligne de commande. Contrairement à mon R qui est installé à partir du référentiel Fedora dans mon système Linux, j'ai téléchargé mon package "celestial" dans un répertoire différent dans mon "home". Chaque fois que je demande la fonction "cosvol()", il dit, "could not find function "cosdistCoVol"." Je ne sais pas comment faire en sorte que R connaisse mon répertoire dans lequel toutes les fonctions sont téléchargées dans mon package "celestial" séparément. Votre aide est appréciée.

0 votes

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

0 votes

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

29voto

Gavin Simpson Points 72349

Un autre problème, en présence d'un ESPACE DE NOM, 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)
Erreur : impossible de trouver la fonction "plot.prcomp"

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

> getAnywhere(plot.prcomp)
Un seul objet correspondant à ‘plot.prcomp’ a été trouvé
Il a été trouvé aux endroits suivants
registred S3 method for plot from namespace stats
namespace:stats
avec la valeur

function (x, main = deparse(substitute(x)), ...) 
screeplot.default(x, main = main, ...)

Nous pouvons donc maintenant l'appeler directement en utilisant :

> stats:::plot.prcomp(mod)

J'ai utilisé plot.prcomp juste comme exemple pour illustrer le but. En utilisation normale, vous ne devriez pas appeler les méthodes S3 de cette manière. Mais comme je l'ai dit, si la fonction que vous voulez appeler existe (il pourrait s'agir d'une fonction utilitaire cachée par exemple), mais est dans un espace de nom, R signalera qu'il ne peut pas trouver la fonction à moins que vous ne lui disiez dans quel espace de nom chercher.

Comparez cela à ce qui suit: stats::plot.prcomp Ce qui précède échoue car bien que stats utilise plot.prcomp, il n'est pas exporté de stats comme l'erreur nous l'indique à juste titre:

Erreur : 'plot.prcomp' n'est pas un objet exporté de 'espace de nom:stats'

Ceci est documenté comme suit:

pkg::nom renvoie la valeur de la variable exportée nom dans l'espace de nom pkg, tandis que pkg:::nom renvoie la valeur de la variable interne nom.

1 votes

Merci - ceci m'a sauvé après la mise à niveau vers R 3 pour could not find function "anova.lm"... corrigé en appelant stats:::anova.lm() à la place

0 votes

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

1 votes

@NelsonGon Avec tout le respect dû, :: et ::: sont différents et votre édition ne fonctionne pas ! La fonction plot.prcomp() n'est pas exportée de l'espace de noms stats donc vous devez utiliser :::.

12voto

Iterator Points 10485

Je peux généralement résoudre ce problème lorsque j'ai le contrôle d'un ordinateur, mais c'est plus ennuyeux 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 a souvent été qu'un package n'était pas installé parce qu'une dépendance ne l'était pas. Pour y remédier, je vérifie ce qui suit :

  1. Fortran est-il installé? (Recherchez 'gfortran'.) Cela affecte plusieurs packages importants dans R.
  2. Java est-il installé? Les chemins des classes Java sont-ils corrects?
  3. Vérifiez que le package a bien été installé par l'administrateur et est disponible pour l'utilisation par l'utilisateur approprié. Parfois, les utilisateurs installent des packages dans de mauvais endroits ou exécutent sans accès approprié aux bonnes bibliothèques. .libPaths() est un bon contrôle.
  4. Vérifiez les résultats de ldd pour R, pour être sûr des bibliothèques partagées.
  5. Il est bon d'exécuter périodiquement un script qui charge simplement chaque package nécessaire et effectue un petit test. Cela permet de repérer le problème du package le plus tôt possible dans le flux de travail. C'est similaire aux tests de construction ou aux tests unitaires, sauf que c'est plus comme un test fumigène pour s'assurer que les bases fonctionnent correctement.
  6. Si les packages peuvent être stockés dans un emplacement accessible par le réseau, sont-ils? S'ils ne le peuvent pas, existe-t-il un moyen de garantir des versions cohérentes sur l'ensemble des machines? (Cela peut sembler hors sujet, mais une installation correcte du package inclut la disponibilité de la bonne version.)
  7. Le package est-il disponible pour le système d'exploitation donné? Malheureusement, tous les packages ne sont pas disponibles sur toutes les plateformes. Cela remonte à 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 package ou en désactivant la dépendance dans certains cas.

Ayant rencontré cela assez souvent, certaines de ces étapes deviennent assez routinières. Bien que le n°7 puisse sembler être un bon point de départ, ils sont listés dans l'ordre approximatif de la fréquence à laquelle je les utilise.

2 votes

Considérations utiles pour être sûr, mais plus une réponse à "Pourquoi ai-je une erreur lors de l'installation d'un package".

0 votes

@DWin : Peut-être, mais pas vraiment. J'ai peut-être été peu 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 que quelques-uns des éléments qui viennent de chaque phase, du moins en ce qui concerne le son strident qui se produit lorsqu'une fonction n'est pas disponible. :)

6voto

Jacob Points 1

Si cela se produit lorsque vous vérifiez votre package (R CMD check), jetez un œil à votre NAMESPACE.

Vous pouvez résoudre ce problème en ajoutant la déclaration suivante au NAMESPACE:

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

Cela 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("ma fonction cachée")

0 votes

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

1 votes

Avez-vous des suggestions sur ce que je pourrais faire si j'obtiens une erreur en utilisant un package que je n'ai pas écrit? Le package semble vouloir utiliser une méthode interne qui n'est pas définie car, vraisemblablement, l'auteur n'a 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 produire lors de l'exécution de R CMD check d'un package que je faisais avec RStudio. J'ai trouvé que l'ajout

exportPattern(".")

au fichier NAMESPACE a fonctionné. En passant, j'avais initialement configuré RStudio pour utiliser ROxygen pour générer la documentation - et j'avais sélectionné la configuration où ROxygen devait écrire mon fichier NAMESPACE pour moi, ce qui effaçait mes modifications. Ainsi, dans mon cas, j'ai décoché NAMESPACE de la configuration Roxygen et ajouté exportPattern(".") à NAMESPACE pour résoudre cette erreur.

1 votes

Tu ferais mieux d'utiliser roxygen2, car celui-ci reconnaît les modifications que tu apportes aux fichiers de l'espace de noms et les garde intactes. Je te conseillerais également fortement de ne pas utiliser exportPattern(".") dans le fichier de l'espace de noms. Utilise plutôt la balise @export dans tes fichiers individuels, afin d'exporter uniquement les fonctions qui doivent l'être. Roxygen2 mettra automatiquement à jour l'espace de noms pour exporter toutes les fonctions qui doivent l'être.

1 votes

Joris - Je suis vraiment reconnaissant que tu aies pris le temps de commenter; je suis entièrement d'accord avec ce que tu as écrit. J'utilise maintenant devtools/roxygen2 et j'ajoute ce qui suit à toutes les fonctions que j'ai besoin d'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