为什么R语言的is.recursive函数对函数类型返回TRUE?
这个判定结果是有合理设计依据的,并非R源代码的疏漏,核心原因是is.recursive()的判定逻辑和大多数人直觉理解的「支持[[提取的列表式递归结构」有差异:
- R底层对所有对象做了二元分类:原子类型(atomic)和递归类型(recursive),二者完全互斥。
is.recursive(x)的底层判定逻辑本质是!is.atomic(x),只要不是原子类型的对象,都会返回TRUE。 - 常见的原子类型只有逻辑值、整数、浮点数、字符串、复数、raw二进制这几类,函数属于closure类型,显然不在原子类型范围内,自然会被判定为递归类型。
- 你观察到的「函数不支持
[[提取」的特性,和是否属于递归类型没有必然关联:递归类型是广义的类型分类,指内部由多个可嵌套的R对象组合而成的结构,不代表必须暴露列表式的子集提取接口。
函数的内部结构其实完全符合递归定义:你可以通过formals(mean)取它的参数列表、body(mean)取它的函数体、environment(mean)取它的绑定环境,这三个组件本身又可以嵌套其他递归结构(比如函数体内可以再定义子函数),本质是树状的递归结构,只是R没有为closure类型开放[[的访问方式而已。
同属递归类型但不支持[[提取的对象还有很多,比如公式~x+y、环境对象new.env()等,调用is.recursive()对它们传参都会返回TRUE。
R官方帮助文档里的描述“具有递归(类列表)结构”确实存在误导性,这里的「类列表」是广义的「多组件可嵌套结构」,不是特指我们常用的
list类型对象。
内容的提问来源于stack exchange,提问作者dww
相关产品推荐
相关产品推荐

