在 R 中,公式可以看作是一棵树,其中父节点位于索引
[[1]]
以及后续索引中的左右项。
例如,公式
f
定义为:
f <- y ~ (a*x) +(b*x) + (c*z)
f[[1]]
是~
,f[[2]]
是y
。最后一项 f[[3]]
将返回方程的右侧。 f[[3]][[2]][[2]][[2]][[3]]
最终返回第一次出现的x
。
如何在树中导航以获取通向特定符号的所有路径?
例如,要到达
x
,有两条路径:{3, 2, 2, 2, 3} 和 {3, 2, 3, 2, 3}。我们可以用 f[[3]][[2]][[2]][[2]][[3]]
来检查我们确实得到了 x
在树中的第一次出现。
一种方法是使用递归函数将公式转换为其元素的嵌套列表:
library(rrapply)
f2list <- \(x) {
lapply(as.list(x), \(y) if (inherits(y, c("call", "(")))
f2list(y)
else
list(as.character(y)))
}
然后定义一个函数来搜索嵌套列表并使用
rrapply::rrapply()
返回匹配元素的索引
find_ind <- \(f, value) {
rrapply(
f2list(f),
condition = \(x) x == value,
f = \(x, .xpos) head(.xpos, -1),
how = "flatten"
)
}
find_ind(f, "x")
[[1]]
[1] 3 2 2 2 3
[[2]]
[1] 3 2 3 2 3
确认这些是公式中
x
元素的索引:
lapply(find_ind(f, "x"), \(i) f[[i]])
[[1]]
x
[[2]]
x