如果我输入methods(print)
,我会得到一长串方法。
对于班级data.frame
的对象,将调用print.data.frame
。
虽然并非总是如此简单:
hw <- "hello world"
class(hw) # [1] "character"
没有print.character
方法。如何知道执行print(hw)
时调用哪种方法?
答案 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将调度。
或者至少我是如何理解的。