【问题标题】:R - extract variable names from unevaluated expressionR - 从未计算的表达式中提取变量名
【发布时间】:2013-09-09 10:43:21
【问题描述】:

假设以下模型

由不熟悉 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']) 的方法。

问题:有没有一种方法可以在不评估模型的情况下解析模型并创建一个列表,其中包含由模型表达式左侧命名的元素,例如

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 变量分配正确的值来评估它的表达式,具体取决于没有正在评估的目标

【问题讨论】:

  • 我认为如果您显示一些输入数据会很有帮助。
  • 还有你想要的输出。正如目前所描述的,看起来您拥有三个完全独立的模型,它们可能首先具有不同名称的输入变量。您能否描述一下您的实际问题,而不是您尝试创建的用于解决该问题的模型?
  • 已编辑问题以希望使问题更清晰。
  • 也许do.call(exp,goal1) ?

标签: r parsing expression expression-evaluation


【解决方案1】:

expression(x=y+z) 的“左侧”实际上是您传递给expression() 的参数的名称,其 是(未计算的)致电y + z。所以它不是表达式的一部分,而是作为列表元素的名称返回(表达式是调用列表,通常未命名):

> 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 是一个符号。

【讨论】:

  • 谢谢,这正是我需要的!
猜你喜欢
  • 2021-07-05
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多