2013-10-08 29 views
3

問:如何找出正在使用哪個(版本的)函數?

我怎樣才能找出一個函數的版本被稱爲?例如,如果我在data.frame上使用unique,我認爲我正在使用unique.data.frame。但是,沒有unique.raster函數,雖然有raster::unique。但是,如果我使用的是trace(unique),我只能得到unique函數正在使用的信息。

例如,我想確認一下,當我撥打unique(data.frame(1))時,unique.data.frame正在被調用。

例子:

我無法弄清楚爲什麼unique(raster_object)作品在命令行而不是一個函數內部。顯然,unique.default正在函數內部調用,所以我想明確說明哪個'唯一。 &

例如這個工程:

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

但是,當我把這個函數:

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

即使包使用raster作爲依賴後,我建立了封裝和負載它在新的R會話中,我收到錯誤:

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

即使sessionInfo()顯示光柵包已加載。

,如果我用debug(unique),它似乎並沒有被告訴我正在調用該函數:

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") 
+0

我不能複製你的問題,但通常你可以調用'調試(唯一的)',然後讓你的'unique'呼叫,步(通過鍵入「N」),看看有什麼函數被調用 – eddi

+0

@eddi重現,你可以嘗試'庫(devtools); install_github(「rhwsd」,「dlebauer」,ref =「717c18f5」);庫(rhwsd); myfun()' –

回答

1
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 

如果有在S3系統出動unique.raster,你也可以使用trace(unique),但自從unique方法類「rasterLayer」是S4的功能,這是行不通的:

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

使用它的包位置:

> 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 = <environment>, untrace = TRUE) : 
    argument "what" is missing, with no default 
> untrace("unique", where=raster) 
Untracing function "unique" as seen from package "raster" 
+0

感謝這個答案 - 我能夠想出這個解決方法,但我真正的問題是什麼調試工具可以幫助我確定何時調用'raster :: unique'。 –

+0

感謝您的澄清 - 我沒有意識到這是使用S3和S4方法的根本區別。 –

+0

是的。這是非常不同的。參見'showMethods' –

相關問題