R替换为列表和评估列表

2023-09-03 14:23:10 作者:幽冥

如果我举这个例子

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,但这无用吗?

求sqlserver的替换一个数据的脚本,需要把GL ztcs表的字段中的数据替换 不要用update单条语句

谢谢

推荐答案

我认为关于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求值,以给出实际的 表达式对象。