Erreur: impossible de trouver la fonction… en R

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

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

J’utilise R et 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 le résoudre?

Il y a quelques points à vérifier:

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

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

  1. Si vous êtes certain 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 vous indiquera le paquetage contenu.
  2. find et getAnywhere peuvent également être utilisés pour localiser des fonctions.
  3. Si vous ne connaissez pas le paquet, vous pouvez utiliser findFn dans le paquet sos , comme expliqué dans cette réponse .
  4. RSiteSearch("some.function") ou la recherche avec rseek sont des moyens alternatifs pour trouver la fonction.

Parfois, vous devez utiliser une version antérieure 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 à ce moment. Si vous utilisez une version R plus ancienne 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 à sauvegarder dans le repository git des backports . Gardez à l’esprit que les versions R antérieures à R3.0.0 sont incompatibles avec les packages conçus pour R3.0.0 et les versions ultérieures.

Un autre problème, en présence d’un NAMESPACE, est que vous essayez d’exécuter une fonction non exscope à partir du paquet 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.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 ::: . Vous devez également connaître l’espace de noms dans lequel la fonction est trouvée. En utilisant getAnywhere() nous trouvons 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, ...)  

Nous pouvons donc maintenant l’appeler directement en utilisant:

 > stats:::plot.prcomp(mod) 

J’ai utilisé plot.prcomp comme exemple pour illustrer l’objective. En utilisation normale, vous ne devriez pas appeler les méthodes S3 comme ceci. Mais comme je l’ai dit, si la fonction que vous voulez appeler existe (cela peut être une fonction d’utilitaire cachée par exemple), mais se trouve dans un espace de noms, R signalera qu’elle ne trouve la fonction que si vous lui indiquez dans.

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 vous travaillez avec une grid. Lorsqu’une grid n’est pas homogène, toutes les bibliothèques ne peuvent pas être installées et j’ai souvent constaté qu’un package n’était pas installé car une dépendance n’était pas installée. Pour y remédier, je vérifie ce qui suit:

  1. Est-ce que Fortran est installé? (Recherchez ‘gfortran’.) Cela affecte plusieurs paquets 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 être utilisé par l’utilisateur approprié. Parfois, les utilisateurs installent des packages au mauvais endroit ou s’exécutent sans access approprié aux bonnes bibliothèques. .libPaths() est une bonne vérification.
  4. Vérifiez les résultats de ldd pour R, pour être sûr des bibliothèques partagées
  5. Il est bon de lancer périodiquement un script qui charge juste chaque paquet nécessaire et effectue un petit test. Cela permet de détecter le problème le plus tôt possible dans le workflow. Cela s’apparente à des tests ou à des tests unitaires, sauf que cela ressemble plus à un test de fumée pour s’assurer que les éléments de base fonctionnent.
  6. Si les paquets peuvent être stockés dans un emplacement accessible en réseau, sont-ils? Si ce n’est pas le cas, 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 plusieurs 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 du package ou en désactivant 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 sharepoint départ, ceux-ci sont listés dans l’ordre approximatif de la fréquence à laquelle je les utilise.

Si cela se produit pendant que vous vérifiez votre colis (vérification R CMD), consultez votre NAMESPACE.

Vous pouvez résoudre ce problème en ajoutant la déclaration 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") 

J’ai eu l’erreur

Erreur: impossible de trouver la fonction some.function

arriver lors de la vérification R CMD d’un paquet que je faisais avec RStudio. J’ai trouvé l’ajout

exportPattern (“.”)

dans le fichier NAMESPACE a fait l’affaire. En tant qu’autre auteur, j’avais initialement configuré RStudio pour utiliser ROxygen pour créer la documentation – et sélectionné la configuration dans laquelle 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 de Roxygen et ajouté exportPattern (“.”) À NAMESPACE pour résoudre cette erreur.

Cette erreur peut se produire même si le nom de la fonction est valide si certains arguments obligatoires sont manquants (vous n’avez pas fourni suffisamment d’arguments).
Je l’ai eu 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 obligatoires pour R. En conséquence, R n’a pas pu trouver une fonction de correspondance 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

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

entrer la description de l'image ici

Si vous utilisez parallelMap vous 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 parallelStart le même argument doit être transmis à parallelExport , sinon vous obtenez la même erreur. Donc, cela devrait être ssortingctement suivi:

 parallelStart(mode = "", N, level = "") parallelExport("", level = "") 

Vous pouvez peut-être corriger cette erreur en espaçant le nom :: l’appel de fonction

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

à

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

J’ai eu la même erreur, je courais la version .99xxx, j’ai vérifié les mises à jour du menu d’aide et mis à jour mon RStudio à 1.0x, puis l’erreur n’est pas venue

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