有可能在R?中重载函数,如plot
函数,这意味着两个函数具有相同的名称但参数列表不同,如何实现?
感谢!!!
答案 0 :(得分:8)
您正在寻找的是methods
。许多常见函数(print
,summary
,plot
)在R中重载,并根据应用它们的对象的class
应用不同的方法。
您提到plot
,但我发现通过查看print
更容易。 R中使用的一个常见数据结构是class
data.frame
的对象。如果查看methods("print")
,您将找到具有此类的对象的特定打印方法。这使得它的打印方式与普通list
不同,尽管data.frame
是R中特殊类型的list
。
示例:
mydf <- data.frame(lengths = 1:3, values = 1:3, blah = 1:3)
mydf ### SAME AS print(mydf)
# lengths values blah
# 1 1 1 1
# 2 2 2 2
# 3 3 3 3
print.default(mydf) ## Override automatically calling `print.data.frame`
# $lengths
# [1] 1 2 3
#
# $values
# [1] 1 2 3
#
# $blah
# [1] 1 2 3
#
# attr(,"class")
# [1] "data.frame"
print(unclass(mydf)) ## Similar to the above
# $lengths
# [1] 1 2 3
#
# $values
# [1] 1 2 3
#
# $blah
# [1] 1 2 3
#
# attr(,"row.names")
# [1] 1 2 3
您当然也可以创建自己的methods
。当您想要使用专门的格式打印内容时,这可能很有用。这是一个用不必要的垃圾打印矢量的简单例子。
## Define the print method
print.SOexample1 <- function(x, ...) {
cat("Your values:\n============",
format(x, width = 6), sep = "\n>>> : ")
invisible(x)
}
## Assign the method to your object
## "print" as you normally would
A <- 1:5
class(A) <- "SOexample1"
print.SOexample1(A)
# Your values:
# ============
# >>> : 1
# >>> : 2
# >>> : 3
# >>> : 4
# >>> : 5
## Remove the "class" value to get back to where you started
print(unclass(A))
# [1] 1 2 3 4 5
您可以想象,您可以让methods
进行自我计算。虽然这看起来很方便,但最终也会导致代码“透明”。