我如何知道将调用哪种方法?

时间:2017-11-23 12:58:38

标签: r methods

如果我输入methods(print),我会得到一长串方法。

对于班级data.frame的对象,将调用print.data.frame

虽然并非总是如此简单:

hw <- "hello world"
class(hw) # [1] "character"

没有print.character方法。如何知道执行print(hw)时调用哪种方法?

2 个答案:

答案 0 :(得分:1)

打开调试打印然后运行示例:

> debug(print)
> print("hello")
debugging in: print("hello")
debug: UseMethod("print")
Browse[2]>  <---------------------------- press Enter to step forward
debugging in: print.default("hello")  <-- this is the method that gets called
debug: {
    noOpt <- missing(digits) && missing(quote) && missing(na.print) && 
        missing(print.gap) && missing(right) && missing(max) && 
        missing(useSource) && missing(...)
    .Internal(print.default(x, digits, quote, na.print, print.gap, 
        right, max, useSource, noOpt))
}

答案 1 :(得分:1)

您是否阅读过Hadley的Advanced R和关于物体的章节?它可能无法给出完整的答案,但从根本上说,您遇到的是C中的方法调度与常规S3行为之间的区别。

[不是R函数,它是C函数,决定使用什么方法在C中完成。这并不意味着你可以&#39;为[(或sum+[<-和其他.Primitive函数创建一个S3方法,但是当你这样做时,更像你&# 39;在C函数基于与常规(和可扩展)R类分开定义的类的最终决定之前,重新为C函数进行包装/预处理,R将调度。

或者至少我是如何理解的。