wake-up-neo.net

Fehler: Funktion ... in R konnte nicht gefunden werden

Dies ist eine FAQ -Frage, bitte seien Sie so vollständig wie möglich. Die Antwort ist eine Community-Antwort. Wenn Sie der Meinung sind, dass etwas fehlt, können Sie es gerne bearbeiten.

Diese Frage wurde auf Meta diskutiert und genehmigt.

Ich verwende R und habe some.function versucht, aber ich habe folgende Fehlermeldung erhalten:

Error: could not find function "some.function"

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

155
Joris Meys

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

  1. Haben Sie den Namen Ihrer Funktion richtig geschrieben? Namen sind case sensitive.
  2. Haben Sie das Paket installiert, das die Funktion enthält? install.packages("thePackage") (dies muss nur einmal gemacht werden)
  3. Haben Sie dieses Paket an den Arbeitsbereich angehängt? require(thePackage) oder library(thePackage) (dies sollte jedes Mal durchgeführt werden, 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 geladen/geladen haben, geben Sie help.search("some.function") oder ??some.function ein, um ein Informationsfeld zu erhalten, in dem Sie erfahren können, in welchem ​​Paket es enthalten ist.
  2. find und getAnywhere können auch zum Auffinden von Funktionen verwendet werden.
  3. Wenn Sie keine Ahnung von dem Paket haben, können Sie findFn im sos-Paket verwenden, wie in diese Antwort erläutert.
  4. RSiteSearch("some.function") oder Suchen mit rdocumentation oder rseek sind alternative Möglichkeiten, um die Funktion zu finden.

Manchmal müssen Sie eine ältere Version von R verwenden, aber für eine neuere Version erstellten Code ausführen. 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 das Paket backports verwenden, um solche Funktionen zur Verfügung zu stellen. Sie finden auch eine Liste der Funktionen, die im git-Repo von backports zurückportiert werden müssen. Beachten Sie, dass ältere R-Versionen als R3.0.0 nicht mit Paketen kompatibel sind, die für R3.0.0 und spätere Versionen erstellt wurden. 

104
Joris Meys

Ein anderes Problem besteht in der Anwesenheit eines NAMESPACE darin, dass Sie versuchen, eine nicht exportierte Funktion aus 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, nehmen wir jedoch an, dass plot.prcomp tatsächlich eine nützliche interne Funktion in Paket foo war. Um eine solche Funktion aufzurufen, benötigen Sie :::, wenn Sie wissen, was Sie tun. Sie müssen auch den Namespace kennen, in dem die Funktion gefunden wird. Mit getAnywhere() finden wir, dass die Funktion im Paket stats ist:

> 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.prcomp nur als Beispiel verwendet, um den Zweck zu veranschaulichen. Im normalen Gebrauch sollten Sie keine S3-Methoden wie diese aufrufen. Aber wie gesagt, wenn die Funktion, die Sie aufrufen möchten, vorhanden ist (es könnte sich beispielsweise um eine verborgene Dienstprogrammfunktion handeln), die sich jedoch in einem Namespace befindet, wird R melden, dass sie die Funktion nicht finden kann, wenn Sie nicht angeben, welchen Namespace sie anzeigen sollen im.

25
Gavin Simpson

Ich kann dieses Problem normalerweise lösen, wenn ein Computer unter meiner Kontrolle steht, aber bei der Arbeit mit einem Netz ist das eher ärgerlich. 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 große Pakete in R.
  2. Ist Java installiert? Sind die Java-Klassenpfade korrekt?
  3. Überprüfen Sie, ob das Paket vom Administrator installiert wurde und für den entsprechenden Benutzer verfügbar ist. Manchmal installieren Benutzer Pakete an den falschen Stellen oder laufen ohne entsprechenden Zugriff auf die richtigen Bibliotheken. .libPaths() ist eine gute Überprüfung.
  4. Überprüfen Sie ldd-Ergebnisse für R, um sicherzugehen, dass gemeinsame Bibliotheken verwendet werden
  5. Es ist gut, regelmäßig ein Skript auszuführen, das jedes benötigte Paket lädt und einige kleine Tests durchführt. Dadurch wird das Paketproblem so früh wie möglich im Workflow erfasst. Dies ist vergleichbar mit Test- oder Unit-Tests, außer dass es eher wie ein Rauchtest ist, um sicherzustellen, dass die Grundfunktionen funktionieren.
  6. Können Pakete an einem für das Netzwerk zugänglichen Ort gespeichert werden? Wenn dies nicht möglich ist, gibt es eine Möglichkeit, konsistente Versionen auf allen Maschinen sicherzustellen? (Dies scheint OT zu sein, aber die korrekte Installation des Pakets schließt die Verfügbarkeit der right -Version ein.)
  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. Versuchen Sie, wenn möglich, einen Weg zu finden, um ein anderes Betriebssystem zu handhaben, indem Sie zu einer geeigneten Variante eines Pakets wechseln oder in bestimmten Fällen die Abhängigkeit deaktivieren.

Einige dieser Schritte sind schon ziemlich alltäglich geworden. Obwohl # 7 als ein guter Ausgangspunkt erscheint, werden diese in ungefährer Reihenfolge der Häufigkeit aufgelistet, die ich sie benutze.

10
Iterator

Wenn dies während der Überprüfung Ihres Pakets auftritt (R CMD-Prüfung), werfen Sie einen Blick auf Ihren NAMESPACE.

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. Dadurch können Sie Ihre verborgenen Funktionen haben, beginnend mit einem Punkt: 

.myHiddenFunction <- function(x) cat("my hidden function")
5
Jacob

Ich hatte den Fehler

Fehler: Funktion some.function konnte nicht gefunden werden

bei der R CMD-Überprüfung eines Pakets, das ich mit RStudio erstellt habe, kann es passieren. Ich fand das Hinzufügen

exportPattern (".")

zu der NAMESPACE-Datei tat den Trick. Als Randbemerkung hatte ich RStudio ursprünglich so konfiguriert, dass es die Dokumentation mit ROxygen erstellt - und die Konfiguration ausgewählt hat, in der ROxygen meine NAMESPACE-Datei für mich schreibt, wodurch meine Änderungen immer gelöscht wurden. Also habe ich in meiner Instanz NAMESPACE von der Roxygen-Konfiguration entfernt und exportPattern (".") Zu NAMESPACE hinzugefügt, um diesen Fehler zu beheben.

4
swihart

Dieser Fehler kann auch dann auftreten, wenn der Name der Funktion gültig ist, wenn einige obligatorische Argumente fehlen (d. H., Sie haben nicht genügend Argumente angegeben).
Ich bekam dies in einem Rcpp-Kontext, in dem ich eine C++ - Funktion mit optionalen Argumenten schrieb und diese Argumente nicht in R zur Verfügung stellte konnte keine passende Funktion für den richtigen Namen finden, aber eine falsche Anzahl von Argumenten.

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

3
Math

Rdocumentation.org hat eine sehr praktische Suchfunktion, mit der Sie unter anderem Funktionen finden können - aus allen Paketen auf CRAN sowie aus Paketen von Bioconductor und GitHub.

 enter image description here

2
maj

Wenn Sie parallelMap verwenden, müssen Sie benutzerdefinierte Funktionen in die Slave-Jobs exportieren, andernfalls erhalten Sie die Fehlermeldung "Funktion konnte nicht gefunden werden".

Wenn Sie für parallelStart ein nicht fehlendes Niveau festlegen, sollte dasselbe Argument an parallelExport übergeben werden. Andernfalls wird derselbe Fehler angezeigt. Also sollte dies strikt beachtet werden:

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

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

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

zu

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