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.
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?
Il y a quelques points à vérifier:
install.packages("thePackage")
(cela ne doit être fait qu'une fois)require(thePackage)
ou library(thePackage)
(cette opération doit être effectuée chaque fois que vous démarrez une nouvelle session R)Si vous ne savez pas dans quel package se trouve cette fonction, vous pouvez faire certaines choses.
help.search("some.function")
ou ??some.function
pour obtenir une boîte d’informations pouvant vous indiquer dans quel paquet il est contenu.find
et getAnywhere
peuvent également être utilisés pour localiser des fonctions.findFn
dans le paquet sos
comme expliqué dans cette réponse .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.
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.
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:
.libPaths()
est une bonne vérification.ldd
pour R afin de vous assurer des bibliothèques partagées.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.
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")
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.
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'erreurRcppFunction(0, 0)
ne le fait pas
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.
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>")
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)