访问和修改任意深度嵌套的 S4 槽

Accessing and modifying arbitrarily deep nested S4 slots

考虑一个递归构造的任意深度嵌套的 S4 对象:

setClass("person", representation(name = "character", child = "ANY"), prototype(name = "", child = NA_real_))
createGeneology <- function(children){
  object <- new("person", name = children[1])
  if(length(children) > 1) object@child <- createGeneology(children[2:length(children)])
  return(object)
}

object <- createGeneology(children = c("Arthur", "Aiden", "Adalyn", "Ava", "Aaron", "Andy"))

在现实世界的情况下,每一层中的槽都对下面的层有一定的依赖性。在这种情况下,它只是一个静态的家谱。

我可以通过输入路径直接访问和修改插槽:

differentKid <- new("person", name = "Logan")
genIV <- object@child@child@child
object@child@child@child <- differentKid

如何动态完成此操作(无需键入任意数量的 @child 元素?)

我可以通过构造一个字符串并用 parse 评估它来动态 访问 对象,但是这个技巧不适用于 modifying 作为 eval 的对象尝试将结果解析为数组:

str <- "object@child@child@child"
genIV <- eval(parse(text = str))

do.call 无效:

do.call("<-", list(eval(parse(text = str)), "new('Person', name = 'Logan')"))

assign 不起作用,get 不起作用,所以这只是不好的做法,是否有更好的方法来做到这一点,或者我缺少什么?

我在 Stack Overflow 上看到过类似的问题,但它们没有处理 S4 对象(处理方式与列表和数组略有不同)。

仍然很高兴听到有人有想法。与此同时,我一直无法找到一种方法来动态访问和修改 S4 对象中的深层递归层。相反,最好的解决方案是递归地将对象折叠成层列表。

由于在特定于 class 的 as.list 操作中折叠层的内存开销,我决定在强制连续层之间的关系时使用对象列表。