动态创建嵌套的 s4 class 插槽名称并在 R 中分配值

Dynamically create nested s4 class slot names and assign values in R

我尝试以动态方式为 R 中嵌套的 s4 类 槽赋值。到目前为止,我所拥有的是下面的代码。我创建了以下嵌套 类 以数字类型的嵌套插槽结尾。

setClass('slot', slots = c(slot = 'numeric'))
setClass('object', slots = c(slot = 'slot'))
object = new('object')
object@slot@slot

典型的分配按预期工作:

object@slot@slot = 1

或:

slot(object@slot, "slot") <- 1

但是我想做的是动态创建插槽名称 例如,使用来自向量的粘贴的分配,例如

slot_path = c("object", "slot", "slot")

使用 eval 和 parse 可以将字符串转换为对象并向我显示对象,或者在这种情况下显示对象的插槽。

eval(parse(text = paste(slot_path, collapse="@")))

然而,为这种构造分配值似乎无法按预期工作。

eval(parse(text = paste(slot_path, collapse="@"))) <- 2

给我的错误是:

Error in file(filename, "r") : cannot open the connection.

如果我像这样手动粘贴路径:

eval(parse(text = "object@slot@slot")) <- 1

我得到的错误是:

Error in eval(parse(text = "object@slot@slot")) <- 1 : target of assignment expands to non-language object

尝试使用 assign() 函数进行赋值也不起作用。 下面的调用:

assign(x = slot(eval(parse(text = "object@slot")), "slot"), value = 1)

给我错误:

Error in assign(x = slot(eval(parse(text = "object@slot")), "slot"), value = 1) : invalid first argument

如有任何帮助,我们将不胜感激。

我找到了解决方案:

对于数字:

eval(parse(text = eval(expression(paste(pasted_slot_path, "<-", value)))))

对于角色:

value = sprintf('"%s"',value)
    eval(parse(text = eval(expression(paste(pasted_slot_path, "<-", value)))))