假设以下模型
由不熟悉R的人写在文本文件中,如下所示:
goal1 = dec1_g1 + dec2_g1 + dec3_g1
goal2 = min(dec1_g2, dec2_g2, dec3_g2)
goal3 = dec1_g3 - dec2_g3 - dec3_g3
...
我需要能够使用模型解析文本文件并评估任何一行,而不必从模型的其余行为dec变量赋值。虽然parse
函数创建了一个未评估的表达式exp
,可以在eval(exp[1]), eval(exp[2])
部分查询和评估,但我找不到像eval(exp['goal1'])
那样的方法。< / p>
问题:有没有办法解析模型而不对其进行评估,并创建一个列表,其中包含由模型表达式左侧命名的元素,例如
model = list(
"goal1" = expression(goal1 = dec1_g1 + dec2_g1 + dec3_g1),
"goal2" = expression(goal2 = min(dec1_g2, dec2_g2, dec3_g2)),
"goal3" = expression(goal3 = dec1_g3 * dec2_g3 * dec3_g3),
...
)
动机:我希望能够从R代码中加载模型,解析它并通过表达式为表达式计算表达式,为 dec 变量分配正确的值没有正在评估的目标。
答案 0 :(得分:1)
expression(x=y+z)
的“左侧”实际上是您传递给expression()
的参数的名称,其值是(未评估的)电话y + z
。所以它不是表达式的一部分,而是作为list元素的名称返回(表达式是一个调用列表,通常是未命名的):
> as.list(expression(x=y+z))
$x
y + z
> names(expression(x=y+z))
[1] "x"
如果,OTOH,您使用公式构造函数~
,那么您将LHS作为表达式的一部分:
> as.list(expression(x~y+z))
[[1]]
x ~ y + z
你可以选择电话的第二个元素:
> expression(x~y+z)[[1]]
x ~ y + z
> expression(x~y+z)[[1]][[1]]
`~`
> expression(x~y+z)[[1]][[2]]
x
注意:在最后一行中,x
是一个符号。