将公式作为有向树进行导航以查找符号的所有出现

问题描述 投票:0回答:1

在 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
在树中的第一次出现。

r tree formula
1个回答
0
投票

一种方法是使用递归函数将公式转换为其元素的嵌套列表:

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
© www.soinside.com 2019 - 2024. All rights reserved.