R:在R包中查找类继承结构

时间:2018-12-20 17:49:22

标签: r oop inheritance package directed-acyclic-graphs

您可以使用

查找包中的所有对象。
objs <- mget(ls("package:base"), inherits = TRUE)

您可以使用

从中选择功能。
funs <- objs[is.function(objs)]

通过将codetools::findGlobals()miniCRAN::makeDepGraphpkgnet::CreatePackageReport(或其他)应用于函数列表,可以获取包中列出的函数的依赖性的完整列表。所有这些函数要么绘制结果依赖性图,要么返回易于绘制的对象,例如igraphDependenciesGraph

是否存在一组可比较的命令来查找由包创建的所有类以及这些类的继承结构?我知道,对于大多数程序包而言,类继承的结果Web相对来说比较简单,但是我认为在某些情况下,例如ggplot2survey程序包中,得出的类继承Web可能是很有帮助。

我找到了一个classGraph包,可以为S4类结构创建有向无环图,但是我对更常见的S3结构更感兴趣。

这似乎蛮横而草率的,但是我想如果我列出了基本软件包中对象使用的所有class属性以及软件包中对象的所有class属性的列表,则后者中不属于前者的任何一个都是由该程序包创建或从另一个非基础程序包继承的新类。

1 个答案:

答案 0 :(得分:0)

这有点棘手,因为我不知道S3 class的任何正式定义。对于R对象,S3类由存储在class属性中的类名称的非常​​简单的字符向量控制。然后,通过将该属性的元素与函数名称进行匹配来完成方法分配。

您基本上可以这样做:

x <- 1:5
class(x) <- "MyMadeUpClass"
x

# [1] 1 2 3 4 5
# attr(,"class")
# [1] "MyMadeUpClass"

以上内容是否在对术语的直观形式理解中真正定义了一个类?

您可以为此类对象创建print方法,例如(传入的愚蠢示例):

print.MyMadeUpClass <- function(x, ...)  {
  print(sprintf("Pretty vector: %s", paste(x, collapse = ",")))
}
x 
# [1] "Pretty vector: 1,2,3,4,5"

这里的重要区别是S3中的方法

  • “属于”(通用)函数,而不是类
  • 是根据提供给函数调用的参数类别选择的

我要说明的是,S3确实没有正式定义的继承(我认为这是您要查找的继承),而与S4相比,它是通过contains实现的概念,因此我不太确定您希望看到什么。

关于主题“面向对象的程序设计,功能性”非常好 约翰·钱伯斯(John M. Chambers)的《 Programming and R》:https://arxiv.org/pdf/1409.3531.pdf

编辑(问题编辑后)- sloop 软件包:

从S3的角度来看,我认为检查泛型和方法的结构很有意义。 A发现sloop软件包对此非常有用:https://github.com/r-lib/sloop