R中的迭代替代

时间:2015-03-19 16:03:17

标签: r recursion lazy-evaluation

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

一些数据开头:

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)

我如何进行迭代替换?我认为最初将别名的定义拆分为基元和复杂,评估第一个基元然后转向复杂。但实际上在复杂的情况下会出现同样的问题,因为它可以链接到另一个复杂的链接到另一个复杂的链接等等。因此,我需要某种减少替代。我觉得我正在创造另一辆自行车。

1 个答案:

答案 0 :(得分:1)

使用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))