R 在本例中,为什么长度(f)和长度(g)之间存在差异? f

R 在本例中,为什么长度(f)和长度(g)之间存在差异? f,r,R,首先,length不是一个典型的泛型函数,而是一个“”。您可以通过查看其定义来了解这一点: f <- function() 1 g <- function() 2 class(g) <- "function" class(f) ## "function" class(g) ## "function" length.function <- function(x) "function" length(f) ## 1 length(g) ## "function" 将

首先,
length
不是一个典型的泛型函数,而是一个“”。您可以通过查看其定义来了解这一点:

f <- function() 1
g <- function() 2
class(g) <- "function"
class(f)  ## "function"
class(g)  ## "function"
length.function <- function(x) "function"
length(f)  ## 1
length(g)  ## "function"
将其与典型的通用函数进行比较:

> length
function (x)  .Primitive("length")
我不确定内部泛型何时会查看用户定义的方法,何时只使用内部方法,它是否已完全定义;我认为一般的想法是,对于用户/包定义的(有效的,非核心的)类,将使用提供的方法。但是对内部类的重写可能有效,也可能无效

此外(尽管与本例并不严格相关),即使对于典型的泛型方法,文档也不清楚当类是隐式派生的而不是作为属性给出时会发生什么。首先,
class()
报告的是事物的合并。从
帮助页:

许多R对象都有一个
class
属性,这是一个字符向量,表示对象从中继承的类的名称。如果对象没有类属性,则它具有隐式类、
“矩阵”
“数组”
模式(x)
的结果(整数向量具有隐式类
“整数”

因此,尽管
class
f
g
返回相同的内容,但它们并不相同

> methods("length")
[1] length.function length.pdf_doc* length.POSIXlt 
现在,这里是它变得模棱两可的地方。方法分派在(至少)两个地方讨论:
class
帮助页面和
UseMethod
帮助页面<代码>使用方法说明:

当调用
UseMethod(“fun”)
的函数应用于具有class属性
c(“first”、“second”)
的对象时,系统首先搜索名为
fun的函数。如果找到该函数,则将其应用于该对象。如果没有找到这样的函数,将尝试一个名为
fun.second
的函数。如果没有类名生成合适的函数,则使用函数
fun.default
(如果存在),否则会导致错误

class
表示:

当通用函数fun应用于具有class属性
c(“first”、“second”)
的对象时,系统将搜索名为
fun.first
的函数,如果找到该函数,则将其应用于该对象。如果没有找到这样的函数,将尝试名为
fun.second
的函数。如果没有类名生成合适的函数,则使用函数
fun.default
(如果存在)。如果没有class属性,则尝试隐式类,然后使用默认方法

真正的区别在于最后一句话,
class
页面有
UseMethod
没有
UseMethod
没有说明如果没有
class
属性会发生什么
class
表示隐式类用于分派。您的代码似乎表明
class
中记录的内容不正确,因为
length.function
如果是
g
就会被调用


当没有类属性时,方法分派中真正发生的事情可能需要检查源代码,因为文档似乎没有帮助。

欢迎使用!请阅读以更好地理解如何表达你的问题。共享代码时也请使用代码标签。您可以通过编辑器添加这些内容。@Carlise:我不需要(如我的编辑中所示)。我认为这是一个关于R的内部运作的有趣的谜题。这很有趣。请注意,
attr(g,“class”)
给出了“函数”,但
attr(f,“class”)
给出了NULL。@Dason,这很简单。这些函数都没有class属性(在
class(g)@Bai之前,函数David linked中的答案是否为您充分解释了这一点,或者在您的特定上下文中进一步解释是否有用?
> methods("length")
[1] length.function length.pdf_doc* length.POSIXlt 
> attributes(f)
$srcref
function() 1

> attributes(g)
$srcref
function() 2

$class
[1] "function"