You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:22:39