根据帮助,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 源代码中的疏忽,还是有合理的理由认为函数应该被视为递归?
函数实际上是一个递归结构,我认为只是出于安全原因他们决定不为该[[函数提供默认方法。您可以获得更多类似列表的表示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)
这确实将主体作为您可以子集化的表达式返回。
因此函数基本上存储为列表的列表,因此它们是递归的。