函数输入参数中的交叉解析

时间:2016-10-06 18:13:29

标签: r parsing

这真的属于"不要 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;在输出中。
我无法遵循逻辑,那么有人可以解释参数解析器如何处理这对荒谬的默认输入吗? (第二种情况很容易遵循)

1 个答案:

答案 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"?>