R替换为列表和评估 [英] r substitute with list and evaluation
本文介绍了R替换为列表和评估的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如果我举这个例子
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
,但这无用吗?
谢谢
推荐答案
我认为关于substitute function/lazy求值和how to use substitute已经有了一些很好的答案。我只想引用substitute function reference(可以追溯到S语言的时代):
参数
expr:任何语法上有效的R表达式
环境:环境或列表对象。默认为当前评估环境。
所以,是的,您可以使用列表,但这不是强制的原因。
它是您调用它的方式,如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中的绑定符号,则保持不变。如果它 是Promise对象,即函数或 使用delayedAssign()显式创建, 承诺取代了这个符号。如果它是普通变量,则其值 被替换,除非env是.GlobalEnv,在这种情况下,符号是 保持不变。 引用和替换都是执行以下操作的基本函数: 不评估他们的论点。 值结果的模式一般为调用,但原则上可以 可以是任何类型的。特别是,单变量表达式具有模式 名称和常量具有适当的基本模式。注意替换在纯词汇的基础上工作。不能保证 生成的表达式没有任何意义。
替换和引号在参数为 表达式(...)。结果是调用表达式构造函数 函数,并且需要用eval求值,以给出实际的 表达式对象。
这篇关于R替换为列表和评估的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文