R中是否存在函数重载?

时间:2013-12-28 07:39:41

标签: r

有可能在R?中重载函数,如plot函数,这意味着两个函数具有相同的名称但参数列表不同,如何实现?

感谢!!!

1 个答案:

答案 0 :(得分:8)

您正在寻找的是methods。许多常见函数(printsummaryplot)在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进行自我计算。虽然这看起来很方便,但最终也会导致代码“透明”。