R中的迭代替换

Iterative substitute in R

我正在尝试为公式创建别名。

开始的一些数据:

data = data.table(C = runif(3), B = runif(3), N = runif(3), G = runif(3))

简单公式

formula = substitute(C ~ I(B / N) + B + G * I(B / N))
lm(formula, data)

现在让我们为 B / N 创建简单的别名并将其命名为 avg_BN

aliases = list(
    avg_BN = quote(B / N)
)
formula_primitive = substitute(C ~ I(avg_BN) + B + G * I(avg_BN), aliases)
lm(formula_primitive, data)

我的问题来了,当我制作复杂的别名时,它们在定义中使用了其他别名(inverse_BNsuper_duper):

aliases_complex = list(
    avg_BN = quote(B / N),
    inverse_BN = quote(1 / avg_BN), #I use alias in alias
    super_duper = quote(avg_BN / inverse_BN) #I use alias in alias
)
formula_complex = substitute(C ~ I(avg_BN) + B + G * I(inverse_BN) + super_duper, aliases_complex)
lm(formula_complex, data)

我如何进行迭代替换? 我最初想将别名的定义拆分为基元和复数,评估第一个基元,然后转到复数。但实际上在复合体中会出现同样的问题,因为它可以 link 到另一个复合体,link 到另一个复合体,依此类推。因此,我需要某种减少替代。我觉得我又创造了一辆自行车。

使用bquote?

e1 <- new.env()
e1$avg_BN <- quote(B / N)
e1$inverse_BN <- bquote(1 / .(avg_BN), e1)
e1$super_duper <- bquote(.(avg_BN) / .(inverse_BN), e1) 

formula_complex <- bquote(C ~ I(.(avg_BN)) + B + G * I(.(inverse_BN)) + .(super_duper), e1)
#C ~ I(B/N) + B + G * I(1/(B/N)) + B/N/(1/(B/N))