【问题标题】:How to find out which (version of a) function is being used?如何找出正在使用的(a 版本)函数?
【发布时间】:2013-10-08 22:18:51
【问题描述】:

问题:

如何找出正在调用的函数的版本?例如,如果我在 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 在函数内部被调用,所以我想明确说明哪个 `unique.&

例如这有效:

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

【问题讨论】:

  • 我无法复制您的问题,但通常您可以拨打debug(unique),然后拨打您的unique 电话并逐步(通过输入“n”)查看调用了哪些函数
  • @eddi 重现,可以试试library(devtools); install_github("rhwsd", "dlebauer", ref = "717c18f5"); library(rhwsd); myfun()

标签: r debugging


【解决方案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),但由于类“rasterLayer”的 unique 方法是 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"

【讨论】:

  • 感谢您的回答 - 我能够想出这个解决方法,但我真正的问题是什么调试工具可以帮助我确定何时/是否调用了 raster::unique
  • 感谢您的澄清 - 我没有意识到这是 S3 和 S4 方法使用方式的根本区别。
猜你喜欢
  • 2016-09-23
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
相关资源
最近更新 更多