【问题标题】:Accessing and modifying arbitrarily deep nested S4 slots访问和修改任意深度的嵌套 S4 插槽
【发布时间】:2021-02-07 14:11:09
【问题描述】:

考虑一个递归构造和任意深度嵌套的 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 评估它来动态访问对象,但是这个技巧不适用于修改对象,因为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 对象(处理方式与列表和数组略有不同)。

【问题讨论】:

    标签: r object s4 slot


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-20
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 2015-08-19
      • 1970-01-01
      相关资源
      最近更新 更多