R 是否使用应用降阶?

Does R use applicative order reduction?

我最近从一个 R 教程中看到了这个例子,我发现这个语法真的很奇怪,因为它暗示了参数被包装/延迟的正常顺序减少。在应用顺序减少中,像这样的事情应该导致所有字符串打印。

switch(grade,
       "A" = print("Great"),
       "B" = print("Good"),
       "C" = print("Ok"),
       "D" = print("Bad"),
       "F" = print("Terrible"),
       print("No Such Grade"))

想知道是否有人知道并熟悉 R 是如何实现它的?

函数的参数,包括 switch,作为承诺传递,只有在实际使用时才被强制执行,即求值。参见 https://cran.r-project.org/doc/manuals/R-ints.html#Argument-evaluation

一个承诺有几个部分。它的值槽在第一次被强制(即访问)时被填充。在那之前,它只是作为未评估的代码及其环境以及表明它尚未评估的组件存在。

f不强制x:

library(pryr)
f <- function(x) promise_info(x)
f(3+pi)

给予:

$code
3 + pi

$env
<environment: R_GlobalEnv>

$evaled
[1] FALSE

$value
NULL

g 强制 x:

g <- function(x) { force(x); promise_info(x) }
g(3 + pi)

给予:

$code
3 + pi

$env
NULL

$evaled
[1] TRUE

$value
[1] 6.141593