这真的属于"不要 DO 的范围!" ,但..
我写这篇文章看看会发生什么。
circit <-function(x=deparse(substitute(y)),y=deparse(substitute(x)))
{
return(list(x=x,y=y))
}
两个例子:
> circit()
$x
[1] "deparse(substitute(x))"
$y
[1] "deparse(substitute(y))"
> circit(3)
$x
[1] 3
$y
[1] "3"
注意&#34; x&#34;的微妙交换。和&#34; y&#34;在输出中。
我无法遵循逻辑,那么有人可以解释参数解析器如何处理这对荒谬的默认输入吗? (第二种情况很容易遵循)
答案 0 :(得分:3)
理解/记住的关键是正式参数是promise对象,而substitute()
对于如何评估promise对象有特殊规则。如?substitute
中所述,它返回表达式槽,而不是它们的值:
通过检查解析的每个组成部分来进行替换 树如下:如果它不是'env'中的绑定符号,则为 不变。如果它是一个承诺对象,即一个正式的论据 一个函数或使用'delayedAssign()'显式创建的 promise的表达式槽替换了符号。如果是的话 普通变量,其值被替换,除非'env'是 '.GlobalEnv',在这种情况下,符号保持不变。
为了更清楚,可能有助于详细介绍该过程。在第一种情况下,您在没有提供参数的情况下调用circuit()
,因此circuit()
使用x=
和y=
的默认值。
对于x
,这意味着通过评估deparse(substitute(y))
来获取其值。该表达式中的符号y
与正式参数y
匹配,这是一个promise对象。 substitute()
将符号y
替换为其表达式槽,其中包含表达式deparse(substitute(x))
。 Deparsing该表达式返回文本字符串"deparse(substitute(x))"
,这是分配给x
的值槽的内容。
同样,y
的值是通过评估表达式deparse(substitute(x))
得到的。符号x
与正式参数x
匹配,这是一个承诺对象。即使x
的值是其他内容,但其表达式广告位仍为deparse(substitute(y))
,因此评估substitute(x)
时返回的内容为deparse(substitute(x))
。因此,"deparse(substitute(y))"
会返回字符串<?php echo "new_file_name"?>