如何修正R6类在函数中继承时父类名称显示异常的问题?
R6子类在函数中生成时无法正确显示父类名称的解决方法
当在函数里通过参数传递父类来创建R6子类时,会出现子类继承信息显示错误的问题:生成的子类会把函数参数名(比如inherit)当成父类名称,而非实际传入的父类(比如Base)。
问题复现代码
myfunc <- function(inherit) { return(R6::R6Class("Derived", inherit = inherit)) } Base <- R6::R6Class("Base") Derived <- R6::R6Class("Derived", inherit = Base) Derived2 <- myfunc(Base) print(Derived) print(Derived2)
运行后,Derived的输出会正确显示Inherits from: <Base>,但Derived2的输出却显示Inherits from: <inherit>。
问题原因
R6在创建类时,默认会记录inherit参数的原始表达式文本,而不是求值后的对象名称。在函数内部传递inherit = inherit时,它捕获的是函数参数的符号名,而非外部传入的Base类的名称。
解决方法
使用substitute()捕获传入参数的原始符号,再传递给R6Class的inherit参数,这样就能让R6记录正确的父类名称。修改后的myfunc如下:
myfunc <- function(inherit) { # 捕获传入参数的原始符号 inherit_parent <- substitute(inherit) R6::R6Class("Derived", inherit = inherit_parent) }
验证效果
重新运行代码后,print(Derived2)的输出会和Derived一致,正确显示:
<Derived> object generator Inherits from: <Base> Public: clone: function (deep = FALSE) Parent env: <environment: 0x...> Locked objects: TRUE Locked class: FALSE Portable: TRUE
补充说明
如果需要处理更复杂的传入情况(比如传入的是表达式而非直接的类对象),可以结合deparse()将符号转换为字符串后再处理,但对于示例中的场景,substitute()已经足够解决问题。
内容的提问来源于stack exchange,提问作者Stefano Borini
相关产品推荐
相关产品推荐

