【问题标题】:Dynamically create nested s4 class slot names and assign values in R动态创建嵌套的 s4 类插槽名称并在 R 中赋值
【发布时间】:2016-07-11 09:11:38
【问题描述】:

我尝试以动态方式将值分配给 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

给我的错误是:

文件错误(文件名,“r”):无法打开连接。

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

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

我收到错误消息:

eval(parse(text = "object@slot@slot")) 中的错误

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

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

给我错误:

分配错误(x = slot(eval(parse(text = "object@slot")), "slot"), value = 1) : 第一个参数无效

对此的任何帮助将不胜感激。

【问题讨论】:

  • slot 有赋值方法,是你想要的吗? ?methods::`slot&lt;-`
  • Nope that is not working: E​​rror in slot(eval(parse(text = "object@slot")), "slot")
  • 这就是我使用 assign 函数的原因,因为它应该将值分配给复杂的字符串。

标签: r s4 slots


【解决方案1】:

我找到了解决办法:

对于数字:

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

对于字符:

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

【讨论】:

  • 这是一个很酷的解决方案,但它会导致所有对象都被评估为向量,因此它不能在 value 是另一个对象的情况下使用(即在我的情况下为 S4)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多