首先,我认为您将从以下资源中受益(15.7 泛型函数面向对象, https://homerhanumat.github.io/r-notes/generic-function-oo.html https://homerhanumat.github.io/r-notes/generic-function-oo.html).
其次,一些定义(摘自https://homerhanumat.github.io/r-notes/glossary-12.html https://homerhanumat.github.io/r-notes/glossary-12.html and https://colinfay.me/r-internals/internal-vs-primitive.html https://colinfay.me/r-internals/internal-vs-primitive.html):
通用函数:“根据输入的类将输入对象分派到多个方法函数之一的函数”。
泛型函数面向对象:“一种面向对象的编程,其中任务由通用函数执行。用于执行特定任务的方法由输入对象的类确定”。
原始函数和内部函数:“在构建时编译成 R 的 C 代码可以直接调用所谓的原语或通过.Internal
界面,与.External
除了语法之外的接口”。
因此,我们可以说:
内部通用函数:通用的原始函数和内部函数(例如,根据输入的类将输入对象分派到多个方法函数之一的函数)。
现在,回答您的问题:
a) 文件是否清晰?
“它是一个通用函数,(内部)默认方法在此处描述”。它明确指出rep
是一个通用函数。 “(内部)”让人瞥见它是一个内部/原始函数。内部需要括号什么?我其实不知道。如果这样写的话肯定会更清楚:“rep
属于内部通用函数类别(参见InternalMethods
)。有关默认方法的详细信息请参见此处”。但是,对于rep.int
and rep_len
它更清晰一些(“在内部,它们是通用的”)。编写好的文档总是很困难!
b) 如何凭经验判断一个函数是否是内部泛型
依赖文档并不总能保证成功。对于 CRAN 提供的多种多样的 R 包来说,这当然是正确的。但是,这个主题不仅仅是一个随机的 R 包,而是低级 R 编程语言。阅读rep
的源代码你,我们可以确认rep是一个原始函数:
> rep
function (x, ...) .Primitive("rep")
通过运行以下命令,我们可以确认rep
是一个泛型函数:
> methods(rep)
[1] rep.bibentry* rep.Date rep.factor rep.numeric_version rep.POSIXct
[6] rep.POSIXlt rep.roman*
所以,rep
必须是内部通用函数。只是为了提供负控制(非通用函数的方法的输出),请参见下文:
> methods(diag)
no methods found
c) R-CRAN资源
最后,CRAN 在编译 R 编程语言的定义方面做得非常出色 (cran.r-project.org/doc/manuals/r-release/R-lang.html); “5 面向对象编程”部分有更多信息。但上面提供的资源更具说教性。 CRAN 提供了一些您可能感兴趣的手册 (cran.r-project.org/manuals.html)。