如何从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
相关产品推荐
相关产品推荐

