【问题标题】:How can I do partial substitution in R?如何在 R 中进行部分替换?
【发布时间】:2014-12-25 15:40:12
【问题描述】:

一个简单的例子:

expr <- quote(x^t)
t <- 2

我想要得到的是表达式x^2

library(pryr)
subs(expr) # x^t
subs(expr, list(t=2)) # expr

【问题讨论】:

  • expr &lt;- x^t 行应该抛出错误(除非您之前定义了xt,在这种情况下它不是返回一个表达式,而是一个数值)。你在做expr &lt;- quote(x^t) 什么的吗?
  • 道歉 - 是的。应该是quote(x^t)

标签: r metaprogramming substitution


【解决方案1】:

使用base R,你可以这样

expr <- quote(x^t)
do.call("substitute", list(expr, list(t=2)))
# x^2

【讨论】:

  • 而仅仅调用替代不会评估它的论点,对吧?
  • 不会。如果您调用substitute(expr),它会将expr 视为表达式,而不会将其解析为x^t
【解决方案2】:

或者(与R Language Definition 中给出的如何执行此操作的示例类似),您可以使用substitute() 两次。

expr <- quote(x^t)
eval(substitute(substitute(e, list(t=2)), list(e=expr)))
# x^2

【讨论】:

  • 你能解释一下这里发生了什么吗?例如,为什么要双重替代?这个成语我以前见过,但有点困惑。
  • @ChristopherBrown -- 查看它在做什么的最好方法是查看运行substitute(substitute(e, list(t=2)), list(e=expr)) 的结果,并找出它为什么会这样。要理解的关键一点是,在该语句中,整个表达式 substitute(e,list(t=2)) 被视为外部 substitute() 调用的 expr 参数。 (我认为这个习语最初难以理解的原因是我们习惯于从最里面的括号集向外评估,但在这种情况下,情况并非如此......)HTH。
猜你喜欢
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
相关资源
最近更新 更多