为什么 is.recursive 对于函数返回 TRUE

dww*_*dww 4 r

根据帮助,is.recursive(x)“如果 x 具有递归(类似列表)结构,则返回 TRUE,否则返回 FALSE”。我很困惑为什么当 x 是函数时它返回 TRUE 。例如:

is.recursive(mean)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

但函数似乎不能在任何有意义的意义上递归,特别是因为它们甚至不能子集:

mean[[1]]
# Error in mean[[1]] : object of type 'closure' is not subsettable
Run Code Online (Sandbox Code Playgroud)

这是 R 源代码中的疏忽,还是有合理的理由认为函数应该被视为递归?

MrF*_*ick 6

函数实际上是一个递归结构,我认为只是出于安全原因他们决定不为该[[函数提供默认方法。您可以获得更多类似列表的表示as.list()

str(as.list(mean))
# $ x  : symbol 
# $ ...: symbol 
# $    : language UseMethod("mean")
Run Code Online (Sandbox Code Playgroud)

所以你得到的是参数列表,然后是函数体。如果你想直接获取尸体,你可以这样做

body(mean)
body(mean)[[1]]
Run Code Online (Sandbox Code Playgroud)

这确实将主体作为您可以子集化的表达式返回。

因此函数基本上存储为列表的列表,因此它们是递归的。