3 Stimmen

Wie findet man heraus, welche (Version einer) Funktion verwendet wird?

Frage:

Wie kann ich herausfinden, welche Version einer Funktion aufgerufen wird? Zum Beispiel, wenn ich unique auf ein data.frame anwende, nehme ich an, dass die Funktion unique.data.frame aufgerufen wird. Es gibt jedoch keine Funktion unique.raster, obwohl es eine raster::unique gibt. Wenn ich aber z.B. trace(unique) verwende, erhalte ich nur die Information, dass die Funktion unique aufgerufen wird.

Ich möchte zum Beispiel bestätigen, dass bei Aufruf von unique(data.frame(1)) die Funktion unique.data.frame aufgerufen wird.

Beispiel:

Ich habe Schwierigkeiten zu verstehen, warum unique(raster_object) an der Befehlszeile funktioniert, aber nicht innerhalb einer Funktion. Offenbar wird innerhalb der Funktion unique.default aufgerufen, daher möchte ich explizit angeben, welches `unique.&

Zum Beispiel funktioniert dies:

library(raster)
a <- rasterFromXYZ(data.frame(a=1:2,b=2:3,c=3:4))
unique(a)

Aber wenn ich dies in eine Funktion setze:

myfun <- function(){
  a <- rasterFromXYZ(data.frame(a=1:2,b=2:3,c=3:4))
  b <- crop(a, extent(c(1,2,3,4)))
  unique(a)
}

auch wenn das Paket raster als Abhängigkeit verwendet wird, nachdem ich das Paket erstellt und in einer neuen R-Sitzung geladen habe, erhalte ich den Fehler:

> myfun()
Error in unique.default(a) : unique() applies only to vectors

Auch wenn sessionInfo() zeigt, dass das raster Paket geladen ist.

und wenn ich debug(unique) benutze, scheint es mir nicht zu sagen, welche Funktion aufgerufen wird:

Browse[6]> unique(a)
Error in unique.default(a) : unique() applies only to vectors
Browse[6]> raster::unique(a)
debugging in: raster::unique(a)
debug: standardGeneric("unique")

2voto

IRTFM Punkte 250762
 myfun <- function(){
   a <- rasterFromXYZ(data.frame(a=1:2,b=2:3,c=3:4))
   b <- crop(a, extent(c(1,2,3,4)))
   raster::unique(a)
 }
 myfun()
#[1] 3 4

Wenn in dem S3-System ein unique.raster aufgerufen würde, könnten Sie trace(unique) verwenden, aber da die Methode unique für die Klasse "rasterLayer" eine S4-Funktion ist, funktioniert das nicht:

> showMethods("unique")
Function: unique (package base)
x="ANY", incomparables="ANY"
x="character", incomparables="missing"
    (inherited from: x="ANY", incomparables="ANY")
x="numeric", incomparables="missing"
    (inherited from: x="ANY", incomparables="ANY")
x="RasterLayer", incomparables="missing"
x="RasterStackBrick", incomparables="missing"

Verwenden Sie den Paketstandort:

> trace("unique", browser, where=raster)
Tracing function "unique" as seen from package "raster"
[1] "unique"
> myfun()
Tracing unique(xyz[, 1]) on entry 
Called from: eval(expr, envir, enclos)
Browse[1]> 
Browse[1]> c
[1] 3 4
> untrace()
Error in methods::.TraceWithMethods(where = , untrace = TRUE) : 
  argument "what" is missing, with no default
> untrace("unique",  where=raster)
Untracing function "unique" as seen from package "raster"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X