27 Evaluation
“Evaluation”(求值)是指执行代码并计算表达式的值的过程。
延迟求值:某些编程语言支持延迟求值(Lazy Evaluation),这意味着表达式的求值被推迟到其结果实际需要时才进行。
即时求值:与延迟求值相对的是即时求值(Eager Evaluation),在这种情况下,表达式尽可能早地被求值。
元编程:在元编程中,代码可以生成或操作其他代码,求值过程可以应用于这些动态生成的代码。
27.1 非标准求值
27.2 整洁求值
Tidy Evaluation (Tidy Eval) 是一个非标准评估的框架,也叫延迟评估。
quasiquotation
quosures
data masking
27.3 Quosure
Show the code
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | “cyl” | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 | cyl |
Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 | cyl |
Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 | cyl |
Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 | cyl |
Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 | cyl |
Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 | cyl |
Show the code
mpg | mean |
---|---|
10.4 | 8 |
13.3 | 8 |
14.3 | 8 |
14.7 | 8 |
15.0 | 8 |
15.2 | 8 |
15.5 | 8 |
15.8 | 8 |
16.4 | 8 |
17.3 | 8 |
17.8 | 6 |
18.1 | 6 |
18.7 | 8 |
19.2 | 7 |
19.7 | 6 |
21.0 | 6 |
21.4 | 5 |
21.5 | 4 |
22.8 | 4 |
24.4 | 4 |
26.0 | 4 |
27.3 | 4 |
30.4 | 4 |
32.4 | 4 |
33.9 | 4 |
27.4 Data masking
环境变量(
env-variables
) ,一般你在Rstuido右上角的Environment
中发现它。比如n <- 10
这里的n
数据变量(
data-variables
),一般指数据框的某个变量。比如data <- data.frame(x = 1, n = 2)
中的data$n
grouped_mean(mtcars, cyl, mpg)
cyl
和mpg
是打算传递的参数,是环境变量,但我们期望他们在函数中当作mtcars中的数据变量,即当做mtcars的一个列的名字来使用, 那么要完成这个角色转换,就需要引用(quote)和解引用(unquote)两个工序:
第一步,用
enquo()
把用户传递过来的参数引用起来第二步,用
!!
取消引用,然后使用参数的内容
这个quote-unquote
的过程让环境变量名变成了数据变量,也可以理解为在函数评估过程中,数据变量(data-variable)遮盖了环境变量(env-variable),即数据遮盖(data masking),看到cyl,正常情况下,本来应该是到环境变量里去找这个cyl对应的值,然而,数据遮盖机制,插队了,让代码去数据变量中去找cyl以及对应的值。
我们通过rlang::qq_show()
看看这个quote-unquote
机制是怎么工作的
先看看qq_show()
27.5 名称注入
27.5.1 glue 语法
Show the code
name <- "susan"
tibble("{name}" := 2)
susan |
---|
2 |
27.5.2 embracing 语法
Show the code
cyl | mean_displ | sum_displ | n_displ |
---|---|---|---|
4 | 2.145679 | 173.8 | 81 |
6 | 3.408861 | 269.3 | 79 |
8 | 5.132857 | 359.3 | 70 |
5 | 2.500000 | 10.0 | 4 |
何时使用{{}}
Data-masking: arrange()filter()summarize() compute with variables
Tidy-selection:select()relocate()rename() select variables