【问题标题】:r substitute with list and evaluationr 用列表和评估代替
【发布时间】:2020-11-19 09:08:04
【问题描述】:

如果我做这个例子

match_caller <- function(x) 1L
crazy_function <- function(x) substitute(match_caller(x),list(x=x))
crazy_function2 <- function(x) substitute(match_caller(x))

a <- 10L
crazy_function(a^2)
#> match_caller(100)
crazy_function2(a^2)
#> match_caller(a^2)

这似乎表明,通过使用带有列表而不是 env 的替换,其优点是它在替换之前评估变量。总是这样吗? 现在,如果我想在替换之前进行评估,出于安全原因,我使用force,但这没用吗?

谢谢

【问题讨论】:

  • 我会说你不需要force。从?substitute 中的示例可以看出,这正是您应该如何使用substitute。另外,作为记录,如果match_caller &lt;- fuction(x) 1,您将得到完全相同的结果。所以包装函数没有区别。
  • @Edo 嗨,是的,谢谢你的评论。我放了匹配电话,因为我想这样做是为了捕捉评估的电话。但我会把你的通知放在我的简单例子中。我认为?substitute 不清楚它是否评估列表 arg。

标签: r list lazy-evaluation substitution


【解决方案1】:

我认为关于substitute function/lazy 评估和how to use substitute 已经有了一些很好的答案。我只想引用substitute function reference(追溯到S语言时代):

参数

expr:任何语法上有效的 R 表达式
env:环境或列表对象。默认为当前评估环境。

所以,是的,您可以使用列表,但这不是强制的。

这是您调用它的方式,如 this answer 中所示,它再次显示了如何在值 [1] 中替换表达式:

substituteExpr <- function(expr, env) {
  do.call(substitute, list(expr=expr[[1]], env=env))
}
substituteExpr(a^2, list(x=2)) # 100

如果 expr 的值是表达式,则替换 env 中绑定的任何变量(它的值,而不是表达式)。

参考详情:

通过检查解析树的每个组件来进行替换 如下:如果不是env中的绑定符号,则不变。如果它 是一个承诺对象,即,一个函数的正式参数或 使用delayAssign() 显式创建的表达式槽 承诺替换符号。如果是普通变量,它的值 被替换,除非 env 是 .GlobalEnv 在这种情况下符号是 保持不变。

quote 和substitute 都是“特殊”的原始函数 不评估他们的论点。

Value 结果的模式一般是“调用”但原则上可以 是任何类型。特别是,单变量表达式具有众数 “名称”和常量具有相应的基本模式。

注意替代品在纯粹的词汇基础上工作。没有保证 结果表达式有意义。

当论点是 表达(...)。结果是对表达式构造函数的调用 功能,需要用 eval 进行评估以给出实际的 表达式对象。

【讨论】:

  • 感谢您的回复。我的问题不是关于如何使用替代品,而是关于 env arg 中调用的列表。我想知道它是否经过系统评估,我在您展示的帖子中找不到答案。抱歉,如果有点不清楚。
猜你喜欢
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 2015-04-28
相关资源
最近更新 更多