【发布时间】: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 对象(处理方式与列表和数组略有不同)。
【问题讨论】: