如何在R Reference Class中按名称动态添加新变量?
解决方案
下面是修改后的代码,能实现你需要的功能:
MyClass <- setRefClass("MyClass", fields = list( ), methods = list( initialize = function(x){ # 检查输入是否为numeric类型 stopifnot(is.numeric(x)) # 获取传入参数的变量名 var_name <- deparse(substitute(x)) # 为对象动态添加指定名称的属性,并赋值 .self[[var_name]] <- x } ) ) my_var_name <- 1 obj <- MyClass$new(x = my_var_name) # 测试访问属性 obj$my_var_name # 输出:[1] 1
关键步骤说明:
deparse(substitute(x)):提取你传入x参数时使用的变量名称(此处为my_var_name),而非参数本身的值。.self[[var_name]] <- x:借助Reference Class实例的.self对象,以提取到的变量名作为属性名,将x的值赋值给这个新属性,实现obj$my_var_name的直接访问。stopifnot(is.numeric(x)):确保传入变量符合要求的numeric类型,非法输入会直接报错。
如果想更贴合Reference Class的字段管理机制,也可以用$set方法添加字段(自动校验类型):
initialize = function(x){ var_name <- deparse(substitute(x)) # 动态添加字段并指定类型为numeric .self$set(name = var_name, value = x, class = "numeric") }
这个方法会自动校验x的类型是否匹配numeric,不匹配时直接抛出错误。
内容的提问来源于stack exchange,提问作者温泽海
相关产品推荐
相关产品推荐

