Erreur: impossible de trouver la fonction… dans R

177

Ceci est censé être une question de FAQ, alors soyez aussi complet que possible. La réponse est une réponse de la communauté, alors n'hésitez pas à 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 some.functionj'ai essayé 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 le résoudre?

Joris Meys
la source
5
Avant de voter pour fermer cette question, lisez d'abord cette discussion sur meta: meta.stackexchange.com/questions/101892/…
Andrie
2
Si tout le reste échoue, essayez de grepping le code source pour la base R et vos packages installés
nullglob
3
@nullglob Cela semble quelque peu extrême :-)
Gavin Simpson
J'ai une question pertinente: stackoverflow.com/questions/23357551/… . Dans ce cas, TOUTE Rcommande échoue, mais q()! Les conseils seront grandement appréciés!
Aleksandr Blekh
Peut-être idiot, mais veillez à ne pas nommer la sortie de la fonction comme la fonction elle-même. [Appris par l'expérience ...]
user3507584

Réponses:

126

Il y a quelques points à vérifier:

  1. Avez-vous correctement écrit le nom de votre fonction? Les noms sont sensibles à la casse.
  2. Avez-vous installé le package contenant la fonction? install.packages("thePackage")(Cela a seulement besoin d'être fait une fois)
  3. Avez-vous joint ce package à l'espace de travail? require(thePackage)ou library(thePackage)(cela devrait être fait chaque fois que vous démarrez une nouvelle session R)
  4. Utilisez-vous une ancienne version R où cette fonction n'existait pas encore?

Si vous ne savez pas dans quel package se trouve cette fonction, vous pouvez faire plusieurs choses.

  1. Si vous êtes sûr d'avoir installé et attaché / chargé le bon package, tapez help.search("some.function")ou ??some.functionpour obtenir une boîte d'informations qui peut vous dire dans quel package il est contenu.
  2. findet getAnywherepeut également être utilisé pour localiser des fonctions.
  3. Si vous n'avez aucune idée du package, vous pouvez l'utiliser findFndans le sospackage comme expliqué dans cette réponse .
  4. RSiteSearch("some.function")ou la recherche avec rdocumentation ou rseek sont des moyens alternatifs de trouver la fonction.

Parfois, vous devez utiliser une ancienne version de R, mais exécutez le 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 alors. Si vous utilisez une ancienne version de R et que vous souhaitez utiliser une fonction plus récente, vous pouvez utiliser les backports du package pour rendre ces fonctions disponibles. Vous trouverez également une liste des fonctions qui doivent être rétroportées sur le référentiel git des backports . Gardez à l'esprit que les versions R antérieures à R3.0.0 sont incompatibles avec les packages créés pour R3.0.0 et les versions ultérieures.

Joris Meys
la source
Salut 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" dans le package "celestial" de la 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 de mon "home". Chaque fois que je demande la fonction "cosvol ()", il 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 séparément dans mon package "céleste". Votre aide est appréciée.
Benjamin
Si la fonction se trouve dans l'une des bibliothèques core / base R, vous devrez peut-être la mettre à jour. Dans mon cas, j'essayais d'utiliser la hasNamefonction dans utils. Cependant, j'utilisais 3.3.1 et je n'ai été hasNameintroduit qu'à partir de 3.4.0. Comme vous ne pouvez pas mettre utilsà jour en tant que bibliothèque autonome, R / R Studio a déclaré que je n'avais aucune bibliothèque à mettre à jour.
mpag
@mpag C'est parce que le paquet utils fait partie intégrante de la version R. Si vous utilisiez littéralement RSiteSearch ("hasName"), la première entrée est une référence au package de 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 l'avoir notifié
Joris Meys
@JorisMeys c'est très utile. Je voudrais également soumettre qu'il devrait être pratique courante de documenter lorsqu'une fonction a été ajoutée à R sur la page d'aide de cette fonction (par exemple? HasName). Par exemple, ni https://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasNameni https://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.htmldire "introduit dans R 3.4.0" J'ai fini par le découvrir en parcourant les dépôts de github et en regardant blamepour utils / R / hasName.R et base / R / match.R
mpag
@mpag ou vous auriez pu ouvrir littéralement le premier accès RSiteSearch("hasName")et obtenir les mêmes informations. C'est pourquoi j'ai ajouté cela il y a des années à cette réponse. C'est une astuce utile à savoir ;-)
Joris Meys
29

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

Par exemple (artificiel, je sais, mais):

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

Premièrement, vous ne devriez pas appeler directement les méthodes S3, mais supposons que plot.prcompc'était en fait une fonction interne utile dans le 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 noms dans lequel se trouve la fonction. En utilisant, getAnywhere()nous constatons que la fonction est dans les statistiques du package :

> 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.prcompjuste comme exemple pour illustrer le but. En utilisation normale, vous ne devriez pas appeler des méthodes S3 comme celle-ci. Mais comme je l'ai dit, si la fonction que vous souhaitez appeler existe (il peut s'agir d'une fonction utilitaire cachée par exemple), mais qu'elle est dans a namespace, R signalera qu'il ne peut pas trouver la fonction à moins que vous ne lui disiez dans quel espace de noms chercher .

Comparez cela à ce qui suit: stats::plot.prcomp Ce qui précède échoue car pendant qu'il est statsutilisé plot.prcomp, il n'est pas exporté, statscar l'erreur nous le dit à juste titre:

Erreur: 'plot.prcomp' n'est pas un objet exporté depuis '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, tandis que pkg ::: name renvoie la valeur du nom de la variable interne.

Gavin Simpson
la source
1
merci - cela m'a sauvé après la mise à niveau vers R 3 pour could not find function "anova.lm"... corrigé avec un appel à la stats:::anova.lm()place
ErichBSchulz
Bien que cela ne soit pas pertinent, l'utilisation de :::a été qualifiée d'erreur de conception et c'est ::préférable. Impossible de trouver facilement la référence.
NelsonGon
1
@NelsonGon Avec tout le respect que je vous dois, ::et :::sont différents et votre montage ne fonctionne pas ! La plot.prcomp()fonction n'est pas exportée depuis l'espace de noms stats, vous devez donc l'utiliser :::.
Gavin Simpson
@GavinSimpson C'est vrai! J'ai pris la parole d'un développeur R respecté pour l'erreur de conception et je ne l'avais jamais vraiment vérifiée. C'était peut-être leur opinion personnelle.
NelsonGon
11

Je peux généralement résoudre ce problème lorsqu'un ordinateur est sous mon contrôle, mais c'est plus gênant 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é car une dépendance n'était pas installée. Pour résoudre ce problème, je vérifie les éléments suivants:

  1. Fortran est-il installé? (Recherchez 'gfortran'.) Cela affecte plusieurs packages majeurs dans R.
  2. Java est-il installé? Les chemins de classe Java sont-ils corrects?
  3. Vérifiez que le package a été installé par l'administrateur et disponible pour une utilisation par l'utilisateur approprié. Parfois, les utilisateurs installent des packages aux mauvais endroits ou s'exécutent sans un accès approprié aux bonnes bibliothèques. .libPaths()est un bon chèque.
  4. Vérifiez les lddrésultats pour R, pour être sûr des bibliothèques partagées
  5. Il est bon d'exécuter périodiquement un script qui ne charge que chaque paquet nécessaire et effectue quelques petits tests. Cela corrige le problème du package le plus tôt possible dans le flux de travail. Cela s'apparente à des tests de construction ou à des tests unitaires, sauf que cela ressemble plus à un test de fumée pour s'assurer que les éléments très basiques fonctionnent.
  6. Si les packages peuvent être stockés dans un emplacement accessible par le réseau, le sont-ils? S'ils ne le peuvent pas, existe-t-il un moyen de garantir des versions cohérentes sur toutes les machines? (Cela peut sembler OT, mais l'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 plates-formes. Cela revient à 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 désactivez la dépendance dans certains cas.

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

Itérateur
la source
2
Considérations utiles pour être sûr, mais plus une réponse pour "Pourquoi ai-je une erreur lors de l'installation d'un package".
IRTFM
@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 package n'a pas été installé. Le maintien de la cohérence logicielle 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 son criard qui survient lorsqu'une fonction n'est pas disponible. :)
Iterator
6

Si cela se produit pendant que vous vérifiez votre package (contrôle R CMD), jetez un œil à votre NAMESPACE.

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

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

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

.myHiddenFunction <- function(x) cat("my hidden function")
Jacob
la source
Cela échoue pour moi dans RStudio - Erreur: '\.' est un échappement non reconnu dans la chaîne de caractères commençant par "" ^ [^ \. "
Andrew
1
Des suggestions sur ce que je pourrais faire si j'obtiens l'erreur en utilisant un package que je n'ai pas écrit? Le package lui-même semble vouloir utiliser une méthode interne qui n'est pas définie parce que probablement l'auteur n'a pas fait ce qui précède.
Andre Luus
4

J'ai eu l'erreur

Erreur: impossible de trouver la fonction some.function

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

exportPattern (".")

dans le fichier NAMESPACE a fait l'affaire. Pour rappel, j'avais initialement configuré RStudio pour utiliser ROxygen pour faire la documentation - et sélectionné la configuration où ROxygen écrirait mon fichier NAMESPACE pour moi, ce qui continuait à effacer mes modifications. Donc, dans mon cas, j'ai décoché NAMESPACE de la configuration Roxygen et ajouté exportPattern (".") À NAMESPACE pour résoudre cette erreur.

Swihart
la source
1
Vous feriez mieux d'utiliser roxygen2, qui reconnaît les modifications que vous apportez aux fichiers d'espace de noms et les garde intacts. Je déconseille également fortement d'utiliser exportPattern (".") Dans le fichier d'espace de noms. Utilisez plutôt la balise @export dans vos fichiers individuels, afin d'exporter uniquement les fonctions qui doivent être exportées. Roxygen2 mettra automatiquement à jour l'espace de noms pour exporter toutes les fonctions qui doivent être exportées.
Joris Meys
1
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 dont j'ai besoin exporté: # '@export
swihart
4

Cette erreur peut se produire même si le nom de la fonction est valide si certains arguments obligatoires sont manquants (c'est-à-dire que vous n'avez pas fourni suffisamment d'arguments).
J'ai obtenu cela dans un contexte Rcpp, où j'ai écrit une fonction C ++ avec des arguments optionnels, et je n'ai pas fourni ces arguments dans R. Il est apparu que les arguments optionnels du C ++ étaient considérés comme obligatoires par R. En conséquence, R n'a pas pu trouver une fonction correspondante pour le nom correct mais un nombre incorrect d'arguments.

Fonction Rcpp: SEXP RcppFunction(arg1, arg2=0) {}
R Appels:
RcppFunction(0)déclenche l'erreur
RcppFunction(0, 0)ne

Math
la source
2

Rdocumentation.org a une fonction de recherche très pratique qui - entre autres - vous permet de trouver des fonctions - à partir de tous les packages sur CRAN, ainsi que des packages de Bioconductor et GitHub.

entrez la description de l'image ici

maj
la source
1

Si vous utilisez, parallelMapvous devrez exporter des fonctions personnalisées vers les travaux esclaves, sinon vous obtenez une erreur "Impossible de trouver la fonction".

Si vous définissez un niveau non manquant sur parallelStartle même argument doit être passé parallelExport, sinon vous obtenez la même erreur. Cela devrait donc être strictement suivi:

parallelStart(mode = "<your mode here>", N, level = "<task.level>")
parallelExport("<myfun>", level = "<task.level>")
Échec catastrophique
la source
0

Vous pourrez peut-être corriger cette erreur par l'espacement des noms :: l'appel de fonction

comparison.cloud(colors = c("red", "green"), max.words = 100)

à

wordcloud::comparison.cloud(colors = c("red", "green"), max.words = 100)
Tony Cronin
la source
1
L'erreur dit «comparaison» au lieu de «comparaison». Je pense que l'espace de noms n'était pas le problème :-)
Joris Meys
Bon spot @Joris Meys
Tony Cronin
-1

J'ai eu la même erreur, j'utilisais la version .99xxx, j'ai vérifié les mises à jour dans le menu d'aide et mis à jour My RStudio vers 1.0x, puis l'erreur n'est pas venue

Solution si simple, il suffit de mettre à jour votre R Studio

Akshay Vijay Jain
la source
1
Pourriez-vous s'il vous plaît expliquer quelle était la nature de l'erreur. Cela pourrait aider, mais seulement dans des cas très spécifiques.
Joris Meys