Fehler: Funktion konnte nicht gefunden werden… in R.

177

Dies soll eine FAQ-Frage sein, bitte seien Sie so vollständig wie möglich. Die Antwort ist eine Community-Antwort. Sie können sie also jederzeit bearbeiten, wenn Sie der Meinung sind, dass etwas fehlt.

Diese Frage wurde auf Meta diskutiert und genehmigt.

Ich benutze R und habe es versucht, some.functionaber ich habe folgende Fehlermeldung erhalten:

Error: could not find function "some.function"

Diese Frage taucht sehr regelmäßig auf. Wenn Sie diese Art von Fehler in R erhalten, wie können Sie ihn beheben?

Joris Meys
quelle
5
Bevor Sie abstimmen, um diese Frage zu schließen, lesen Sie zuerst diese Diskussion auf meta: meta.stackexchange.com/questions/101892/…
Andrie
2
Wenn alles andere fehlschlägt, versuchen Sie, den Quellcode für Base R und Ihre installierten Pakete zu
überprüfen
3
@nullglob Das scheint etwas extrem :-)
Gavin Simpson
Ich habe eine relevante Frage: stackoverflow.com/questions/23357551/… . In diesem Fall Rschlägt JEDER Befehl fehl, aber q()! Ratschläge werden sehr geschätzt!
Aleksandr Blekh
Vielleicht albern, aber achten Sie darauf, die Ausgabe der Funktion nicht als die Funktion selbst zu bezeichnen. [Aus Erfahrung gelernt ...]
user3507584

Antworten:

126

Es gibt einige Dinge, die Sie überprüfen sollten:

  1. Haben Sie den Namen Ihrer Funktion richtig geschrieben? Bei Namen wird zwischen Groß- und Kleinschreibung unterschieden.
  2. Haben Sie das Paket installiert, das die Funktion enthält? install.packages("thePackage")(Dies muss nur einmal durchgeführt werden)
  3. Haben Sie dieses Paket an den Arbeitsbereich angehängt? require(thePackage)oder library(thePackage)(dies sollte jedes Mal erfolgen, wenn Sie eine neue R-Sitzung starten)
  4. Verwenden Sie eine ältere R-Version, in der diese Funktion noch nicht vorhanden war?

Wenn Sie nicht sicher sind, in welchem ​​Paket sich diese Funktion befindet, können Sie einige Dinge tun.

  1. Wenn Sie sicher sind, dass Sie das richtige Paket installiert und angehängt / geladen haben, geben Sie help.search("some.function")oder ??some.functionein Informationsfeld ein, in dem angegeben wird, in welchem ​​Paket es enthalten ist.
  2. findund getAnywherekann auch zum Auffinden von Funktionen verwendet werden.
  3. Wenn Sie keine Ahnung von dem Paket haben, können Sie es findFnin dem sosPaket verwenden, wie in dieser Antwort erläutert .
  4. RSiteSearch("some.function")oder die Suche mit rdocumentation oder rseek sind alternative Möglichkeiten, um die Funktion zu finden.

Manchmal müssen Sie eine ältere Version von R verwenden, aber Code ausführen, der für eine neuere Version erstellt wurde. Neu hinzugefügte Funktionen (zB hasName in R 3.4.0) werden dann nicht gefunden. Wenn Sie eine ältere R-Version verwenden und eine neuere Funktion verwenden möchten, können Sie die Paket- Backports verwenden , um solche Funktionen verfügbar zu machen. Sie finden auch eine Liste der Funktionen, die auf dem Git-Repo von Backports zurückportiert werden müssen . Beachten Sie, dass R-Versionen, die älter als R3.0.0 sind, nicht mit Paketen kompatibel sind, die für R3.0.0 und spätere Versionen erstellt wurden.

Joris Meys
quelle
Hallo Joris, ich habe eine kurze Frage. Ich bin neu in R, konnte es aber erfolgreich installieren. Ich möchte die Funktion "cosvol" im Paket "celestial" über die Befehlszeile verwenden. Im Gegensatz zu meinem R, das aus dem Fedora-Repository auf meinem Linux-System installiert ist, habe ich mein "celestial" -Paket in einem anderen Verzeichnis in meinem "home" heruntergeladen. Jedes Mal, wenn ich die Funktion "cosvol ()" anfordere, heißt es: "Die Funktion" cosdistCoVol "konnte nicht gefunden werden." Ich bin nicht sicher, wie ich R über meinen Direktor informieren soll, in dem alle Funktionen in meinem "himmlischen" Paket separat heruntergeladen werden. Deine Hilfe wird geschätzt.
Benjamin
Wenn sich die Funktion in einer der Core / Base R-Bibliotheken befindet, müssen Sie diese möglicherweise aktualisieren. In meinem Fall habe ich versucht, die hasNameFunktion in zu verwenden utils. Ich habe jedoch 3.3.1 verwendet und hasNamewurde erst mit 3.4.0 eingeführt. Da Sie nicht utilsals eigenständige Bibliothek aktualisieren können, gab R / R Studio an, dass ich keine zu aktualisierenden Bibliotheken hatte.
mpag
@mpag Das liegt daran, dass das utils-Paket integraler Bestandteil der R-Version ist. Wenn Sie RSiteSearch ("hasName") wörtlich verwenden würden, ist der erste Eintrag ein Verweis auf das Backports-Paket, das diese Funktion in R 3.3.1 verfügbar macht. Weitere Informationen finden Sie auch unter github.com/r-lib/backports . Ich habe einige Informationen für diesen Fall hinzugefügt, danke für die Benachrichtigung
Joris Meys
@JorisMeys das ist sehr hilfreich. Ich möchte auch einreichen, dass es Standardpraxis sein sollte, zu dokumentieren, wann eine Funktion zu R auf der Hilfeseite dieser Funktion hinzugefügt wurde (z. B.? HasName). ZB weder https://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasNamenoch https://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.htmlsagen "eingeführt in R 3.4.0" Ich fand es heraus, indem ich durch Github-Repos blätterte und nach blameutils / R / hasName.R und base / R / match.R suchte
mpag
@mpag oder Sie hätten buchstäblich den ersten Treffer öffnen RSiteSearch("hasName")und die gleichen Informationen erhalten können. Deshalb habe ich diese Antwort vor Jahren hinzugefügt. Es ist ein nützlicher Trick zu wissen ;-)
Joris Meys
29

Ein weiteres Problem bei Vorhandensein eines NAMESPACE besteht darin, dass Sie versuchen, eine nicht exportierte Funktion aus dem Paket foo auszuführen .

Zum Beispiel (erfunden, ich weiß, aber):

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

Erstens sollten Sie S3-Methoden nicht direkt aufrufen, sondern nehmen an, dass plot.prcompes sich tatsächlich um eine nützliche interne Funktion in Paket foo handelt . Um eine solche Funktion aufzurufen, wenn Sie wissen, was Sie tun, müssen Sie Folgendes verwenden :::. Sie müssen auch den Namespace kennen, in dem sich die Funktion befindet. Mit getAnywhere()wir feststellen , dass die Funktion in Paket - Statistik :

> 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>

So können wir es jetzt direkt aufrufen mit:

> stats:::plot.prcomp(mod)

Ich habe plot.prcompnur als Beispiel verwendet, um den Zweck zu veranschaulichen. Im normalen Gebrauch sollten Sie solche S3-Methoden nicht aufrufen. Aber wie gesagt, wenn die Funktion, die Sie aufrufen möchten, vorhanden ist (es könnte sich beispielsweise um eine versteckte Dienstprogrammfunktion handeln), sich jedoch in a befindet namespace, meldet R, dass die Funktion nur gefunden werden kann, wenn Sie ihr mitteilen, in welchem ​​Namespace gesucht werden soll .

Vergleichen Sie dies mit dem Folgenden: stats::plot.prcomp Das Obige schlägt fehl, da es während der statsVerwendung plot.prcompnicht exportiert wird, statswie der Fehler zu Recht sagt:

Fehler: 'plot.prcomp' ist kein exportiertes Objekt aus 'namespace: stats'

Dies ist wie folgt dokumentiert:

pkg :: name gibt den Wert des exportierten Variablennamens im Namespace pkg zurück, während pkg ::: name den Wert des internen Variablennamens zurückgibt.

Gavin Simpson
quelle
1
danke - das hat mich nach dem Upgrade auf R 3 gerettet für could not find function "anova.lm"... behoben mit stats:::anova.lm()stattdessen Anruf
ErichBSchulz
Obwohl dies nicht so relevant ist, wurde die Verwendung von :::als Konstruktionsfehler bezeichnet, und dies ::wird bevorzugt. Die Referenz kann nicht ohne weiteres gefunden werden.
NelsonGon
1
@NelsonGon Bei allem Respekt, ::und :::sind unterschiedlich und deine Bearbeitung nicht funktioniert ! Die plot.prcomp()Funktion wird nicht aus dem Statistik-Namespace exportiert, daher müssen Sie sie verwenden :::.
Gavin Simpson
@ GavinSimpson Richtig! Ich nahm das Wort eines angesehenen R-Entwicklers für den Konstruktionsfehler und hatte ihn nie wirklich überprüft. Vielleicht war es ihre persönliche Meinung.
NelsonGon
11

Normalerweise kann ich dieses Problem lösen, wenn ein Computer unter meiner Kontrolle steht, aber es ist eher ein Ärgernis, wenn ich mit einem Raster arbeite. Wenn ein Grid nicht homogen ist, werden möglicherweise nicht alle Bibliotheken installiert, und ich habe oft die Erfahrung gemacht, dass ein Paket nicht installiert wurde, weil keine Abhängigkeit installiert wurde. Um dies zu beheben, überprüfe ich Folgendes:

  1. Ist Fortran installiert? (Suchen Sie nach 'gfortran'.) Dies betrifft mehrere Hauptpakete in R.
  2. Ist Java installiert? Sind die Java-Klassenpfade korrekt?
  3. Überprüfen Sie, ob das Paket vom Administrator installiert und für den entsprechenden Benutzer verfügbar ist. Manchmal installieren Benutzer Pakete an den falschen Stellen oder führen sie ohne entsprechenden Zugriff auf die richtigen Bibliotheken aus. .libPaths()ist ein guter Scheck.
  4. Überprüfen Sie die lddErgebnisse für R, um sicherzugehen, dass gemeinsam genutzte Bibliotheken vorhanden sind
  5. Es ist gut, regelmäßig ein Skript auszuführen, das nur jedes benötigte Paket lädt und einige kleine Tests durchführt. Dadurch wird das Paketproblem so früh wie möglich im Workflow behoben. Dies ist vergleichbar mit Build-Tests oder Unit-Tests, außer dass es sich eher um einen Rauchtest handelt, um sicherzustellen, dass die grundlegenden Dinge funktionieren.
  6. Wenn Pakete an einem netzwerkfähigen Ort gespeichert werden können, oder? Wenn dies nicht möglich ist, gibt es eine Möglichkeit, konsistente Versionen auf allen Computern sicherzustellen? (Dies mag OT erscheinen, aber die korrekte Paketinstallation beinhaltet die Verfügbarkeit der richtigen Version.)
  7. Ist das Paket für das angegebene Betriebssystem verfügbar? Leider sind nicht alle Pakete plattformübergreifend verfügbar. Dies geht zurück zu Schritt 5. Wenn möglich, versuchen Sie, einen Weg zu finden, um mit einem anderen Betriebssystem umzugehen, indem Sie zu einer geeigneten Version eines Pakets wechseln oder in bestimmten Fällen die Abhängigkeit ausschalten.

Einige dieser Schritte werden ziemlich routinemäßig. Obwohl # 7 als guter Ausgangspunkt erscheint, werden diese in ungefährer Reihenfolge der Häufigkeit aufgelistet, in der ich sie verwende.

Iterator
quelle
2
Nützliche Überlegungen, um sicher zu sein, aber eher eine Antwort für "Warum erhalte ich einen Fehler bei der Installation eines Pakets".
IRTFM
@ DWin: Vielleicht, aber nicht wirklich. Ich war vielleicht unklar. Diese Probleme treten auf, wenn ein Job in einem Grid zum Stillstand kommt, weil kein Paket installiert wurde. Die Aufrechterhaltung der Softwarekonsistenz in einem Grid ist nicht schwierig, erfordert jedoch einen guten Prozess für Installation, Wartung und Debugging. Dies sind nur einige der Elemente, die aus jeder Phase hervorgehen, zumindest in Bezug auf das Kreischen, das auftritt, wenn eine Funktion nicht verfügbar ist. :)
Iterator
6

Wenn dies auftritt, während Sie Ihr Paket überprüfen (R CMD-Prüfung), sehen Sie sich Ihren NAMESPACE an.

Sie können dieses Problem lösen, indem Sie dem NAMESPACE die folgende Anweisung hinzufügen:

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

Dies exportiert alles, was nicht mit einem Punkt (".") Beginnt. Auf diese Weise können Sie Ihre versteckten Funktionen beginnend mit einem Punkt haben:

.myHiddenFunction <- function(x) cat("my hidden function")
Jacob
quelle
Dies schlägt für mich in RStudio fehl - Fehler: '\.' ist ein nicht erkanntes Escape in der Zeichenkette, beginnend mit "" ^ [^ \. "
Andrew
1
Irgendwelche Vorschläge, was ich tun könnte, wenn ich den Fehler bekomme, während ich ein Paket verwende, das ich nicht geschrieben habe? Das Paket selbst scheint eine interne Methode verwenden zu wollen, die nicht definiert ist, da der Autor vermutlich das oben nicht getan hat.
Andre Luus
4

Ich hatte den Fehler

Fehler: Funktion konnte nicht gefunden werden some.function

passiert, wenn eine R CMD-Prüfung eines Pakets durchgeführt wird, das ich mit RStudio erstellt habe. Ich fand das Hinzufügen

exportPattern (".")

in die NAMESPACE-Datei hat den Trick gemacht. Als Nebenbemerkung hatte ich RStudio zunächst so konfiguriert, dass ROxygen für die Dokumentation verwendet wurde - und die Konfiguration ausgewählt, in der ROxygen meine NAMESPACE-Datei für mich schreiben würde, wodurch meine Änderungen immer wieder gelöscht wurden. In meinem Fall habe ich NAMESPACE in der Roxygen-Konfiguration deaktiviert und exportPattern (".") Zu NAMESPACE hinzugefügt, um diesen Fehler zu beheben.

swihart
quelle
1
Verwenden Sie besser roxygen2, um Änderungen an den Namespace-Dateien zu erkennen und diese intakt zu halten. Ich würde auch dringend davon abraten, exportPattern (".") In der Namespace-Datei zu verwenden. Verwenden Sie stattdessen das Tag @export in Ihren einzelnen Dateien, sodass Sie nur die Funktionen exportieren, die exportiert werden müssen. Roxygen2 aktualisiert den Namespace automatisch, um alle Funktionen zu exportieren, die exportiert werden müssen.
Joris Meys
1
Joris - Ich weiß es wirklich zu schätzen, dass Sie sich die Zeit genommen haben, Kommentare abzugeben. Ich stimme zu 100% dem zu, was Sie geschrieben haben. Ich verwende jetzt devtools / roxygen2 und füge Folgendes in alle Funktionen ein, die ich exportieren muss: # '@export
swihart
4

Dieser Fehler kann auch dann auftreten, wenn der Name der Funktion gültig ist, wenn einige obligatorische Argumente fehlen (dh Sie haben nicht genügend Argumente angegeben).
Ich habe dies in einem Rcpp-Kontext erhalten, in dem ich eine C ++ - Funktion mit optionalen Argumenten geschrieben und diese Argumente in R nicht angegeben habe. Es schien, dass optionale Argumente aus C ++ von R als obligatorisch angesehen wurden. Infolgedessen konnte R nicht finden eine Übereinstimmungsfunktion für den richtigen Namen, aber eine falsche Anzahl von Argumenten.

Rcpp-Funktion: SEXP RcppFunction(arg1, arg2=0) {}
R-Aufrufe: Löst
RcppFunction(0)den Fehler
RcppFunction(0, 0)nicht aus

Mathematik
quelle
2

Rdocumentation.org verfügt über eine sehr praktische Suchfunktion, mit der Sie unter anderem Funktionen finden können - sowohl aus allen CRAN-Paketen als auch aus Paketen von Bioconductor und GitHub.

Geben Sie hier die Bildbeschreibung ein

Maj
quelle
1

Wenn Sie verwenden, müssen parallelMapSie benutzerdefinierte Funktionen in die Slave-Jobs exportieren. Andernfalls wird die Fehlermeldung "Funktion konnte nicht gefunden werden" angezeigt.

Wenn Sie eine nicht fehlende Ebene für parallelStartdasselbe Argument festlegen, an das übergeben werden soll, parallelExportwird derselbe Fehler angezeigt. Das sollte also genau befolgt werden:

parallelStart(mode = "<your mode here>", N, level = "<task.level>")
parallelExport("<myfun>", level = "<task.level>")
katastrophales Versagen
quelle
0

Möglicherweise können Sie diesen Fehler durch den Namensabstand :: den Funktionsaufruf beheben

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

zu

wordcloud::comparison.cloud(colors = c("red", "green"), max.words = 100)
Tony Cronin
quelle
1
Der Fehler lautet "Vergleich" anstelle von "Vergleich". Ich denke, der Namespace war nicht das Problem :-)
Joris Meys
Guter Ort @Joris Meys
Tony Cronin
-1

Ich habe den gleichen Fehler erhalten, ich habe die Version .99xxx ausgeführt, ich habe im Hilfemenü nach Updates gesucht und mein RStudio auf 1.0x aktualisiert, dann ist der Fehler nicht aufgetreten

So einfache Lösung, aktualisieren Sie einfach Ihr R Studio

Akshay Vijay Jain
quelle
1
Könnten Sie bitte näher auf die Art des Fehlers eingehen? Dies könnte helfen, aber nur in ganz bestimmten Fällen.
Joris Meys