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

如何从R6类内部获取该类实例变量的名称?

在R6类内部获取实例变量名称的实现方法

要在R6类内部获取实例被赋值的变量名(比如将Simple$new()赋值给mysimple时,获取"mysimple"),可以通过访问调用栈的上层调用表达式来实现,具体代码如下:

library(R6)

Simple <- R6Class("Simple",
                  public = list(
                    myname = NA_character_,
                    dt = NA,
                    initialize = function() {
                      # 获取上一层的调用表达式
                      parent_call <- sys.call(-1)
                      # 检查是否是赋值操作(<- 或 =)
                      if (is.call(parent_call) && 
                          (parent_call[[1]] == quote(`<-`) || parent_call[[1]] == quote(`=`))) {
                        # 将赋值符号左侧的变量名转为字符串
                        self$myname <- deparse(parent_call[[2]])
                      } else {
                        # 非直接赋值场景下返回NA
                        self$myname <- NA_character_
                      }
                    }
                  )
)

# 测试示例
mysimple <- Simple$new()
mysimple$myname  # 输出: "mysimple"

原理说明

  • 原代码中substitute(self)只能获取initialize函数内部的self符号,因为self是R6类方法的隐式参数,作用域仅限方法内部。
  • 通过sys.call(-1)可以获取上一层的调用栈表达式(即mysimple <- Simple$new()这个赋值语句),然后判断该表达式是否为赋值操作,提取左侧的变量名并转为字符串,即可得到实例的变量名。

局限性说明

  • 若实例不是通过直接赋值创建(比如a <- b <- Simple$new()),该方法会返回离new()最近的变量名(此例中为"b")。
  • 若实例创建后未赋值给变量,或在复杂嵌套环境中创建,可能无法正确获取变量名,此时会返回NA。

内容的提问来源于stack exchange,提问作者IVIM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:12:52