web-dev-qa-db-fra.com

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

Ceci est censé être une FAQ question, alors soyez le plus complet possible La réponse est une réponse de la communauté, alors n'hésitez pas à éditer si vous pensez qu'il manque quelque chose.

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

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

Error: could not find function "some.function"

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

155
Joris Meys

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 paquet contenant la fonction? install.packages("thePackage") (cela ne doit être fait qu'une fois)
  3. Avez-vous attaché ce paquet à l'espace de travail? require(thePackage) ou library(thePackage) (cette opération doit être effectuée chaque fois que vous démarrez une nouvelle session R)
  4. Utilisez-vous une version plus ancienne de R où cette fonction n’existait pas encore?

Si vous ne savez pas dans quel package 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’informations pouvant vous indiquer dans quel paquet il est contenu.
  2. find et getAnywhere peuvent également être utilisés pour localiser des fonctions.
  3. Si vous n'avez aucune idée du paquet, vous pouvez utiliser findFn dans le paquet sos comme expliqué dans cette réponse .
  4. RSiteSearch("some.function") ou la recherche avec rdocumentation ou rseek sont des méthodes alternatives pour trouver la fonction.

Parfois, vous devez utiliser une version plus ancienne de R mais exécuter le 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 version plus ancienne de R et souhaitez utiliser une fonction plus récente, vous pouvez utiliser le package backports pour rendre ces fonctions disponibles. Vous trouverez également une liste des fonctions qui doivent être rétroportées sur le dépôt git des rétroportages . N'oubliez pas que les versions de R antérieures à R3.0.0 sont incompatibles avec les packages conçus pour les versions R3.0.0 et ultérieures. 

104
Joris Meys

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"

Tout d’abord, vous ne devriez pas appeler directement les méthodes S3, mais supposons que plot.prcomp est en fait une fonction interne utile dans le paquet foo. Appeler une telle fonction si vous savez ce que vous faites nécessite l’utilisation de :::. 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 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 l'objectif. En utilisation normale, vous ne devriez pas appeler des méthodes S3 comme ceci. Mais comme je l'ai dit, si la fonction que vous voulez appeler existe (par exemple, une fonction utilitaire masquée), mais qu'elle se trouve dans un espace de noms, R indiquera qu'elle ne peut pas trouver la fonction à moins d'indiquer quel espace de noms rechercher dans.

25
Gavin Simpson

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 ne peuvent pas être installées, et mon expérience m'a souvent montré qu'un paquet n'a pas été installé parce qu'une dépendance n'a pas été installée. Pour remédier à cela, je vérifie les points suivants:

  1. Est-ce que Fortran est installé? (Recherchez 'gfortran'.) Cela affecte plusieurs paquets importants dans R.
  2. Java est-il installé? Les chemins de classes Java sont-ils corrects?
  3. Vérifiez que le package a été installé par l'administrateur et disponible pour l'utilisateur approprié. Parfois, les utilisateurs installent des paquets aux mauvais endroits ou s’exécutent sans accès approprié aux bonnes bibliothèques. .libPaths() est une bonne vérification.
  4. Vérifiez les résultats de ldd pour R afin de vous assurer des bibliothèques partagées.
  5. Il est bon de lancer périodiquement un script qui charge tous les paquets nécessaires et fait quelques tests. Cela intercepte le problème de package le plus tôt possible dans le flux de travail. Cela s'apparente à des tests de construction ou à des tests unitaires, sauf qu’il s’agit plutôt d’un test à la fumée afin de s’assurer que le matériel de base fonctionne.
  6. Si les paquets peuvent être stockés dans un emplacement accessible au réseau, le sont-ils? S'ils ne le peuvent pas, existe-t-il un moyen d'assurer des versions cohérentes sur toutes les machines? (Cela peut sembler un OT, mais une installation correcte du paquet inclut la disponibilité de la version right .)
  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 revient à l'étape 5. Si possible, essayez de trouver un moyen de gérer un système d'exploitation différent en basculant sur une version appropriée du package 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 n ° 7 puisse sembler être un bon point de départ, ceux-ci sont énumérés dans l'ordre approximatif de la fréquence à laquelle je les utilise.

10
Iterator

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 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")
5
Jacob

J'ai eu l'erreur

Erreur: impossible de trouver la fonction some.function

se produit lors de la vérification R CMD d’un paquet que je fabriquais avec RStudio. J'ai trouvé en ajoutant

exportPattern (".")

au fichier NAMESPACE a fait le tour. Sidenote, j’avais initialement configuré RStudio pour utiliser ROxygen afin d’établir la documentation - et sélectionné la configuration dans laquelle ROxygen écrirait mon fichier NAMESPACE, ce qui effacerait sans cesse mes modifications. Donc, dans mon cas, j'ai décoché NAMESPACE de la configuration Roxygen et ajouté exportPattern (".") À NAMESPACE pour résoudre cette erreur.

4
swihart

Cette erreur peut se produire même si le nom de la fonction est valide si des arguments obligatoires sont manquants (c.-à-d. Que 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 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. Par conséquent, R Impossible de 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) soulève l'erreur
RcppFunction(0, 0) ne le fait pas

3
Math

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

 enter image description here

2
maj

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

Si vous définissez un niveau non manquant sur parallelStart, le même argument doit être passé à parallelExport, sinon vous obtenez la même erreur. Donc, cela devrait être strictement suivi:

parallelStart(mode = "<your mode here>", N, level = "<task.level>")
parallelExport("<myfun>", level = "<task.level>")
1

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

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

à

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