26 Quasiquotation
准引用 Quasiquotation
拟引函数 quasiquoting functions
引用(quotation)是捕获未评估表达式的行为
取消引用(unquotation)!!
(发音为bang-bang)是选择性地评估引用的表达式的部分,告诉引用函数删除隐式引号
准引用(Quasiquotation)使得创建将函数作者编写的代码与函数用户编写的代码相结合的函数变得容易
取消引用(unquotation)!!
(发音为bang-bang)告诉引用函数删除隐式引号
Show the code
name <- "Hadley"
time <- "morning"
# quoted
paste("Good", time, name)
#> [1] "Good morning Hadley"
# evaluated
cement(Good, time, name)
#> [1] "Good time name"
cement(Good, !!time, !!name)
#> [1] "Good morning Hadley"
26.1 引用
26.1.1 捕获表达式
空格和注释不是表达式的一部分
捕获(开发人员)形参的表达式,函数主体中
捕获用户作为参数传入的表达式,通过传参提供
26.1.2 捕获 symbol
Show the code
f <- function(...) ensyms(...)
f(x)
#> [[1]]
#> x
f("x")
#> [[1]]
#> x
26.1.3 替换
Show the code
f4 <- function(x) substitute(x * 2)
f4(a + b + c)
#> (a + b + c) * 2
26.2 取消引用
26.2.1 取消引用一个参数
右边是函数调用,评估并插入结果
保留运算符的优先级
26.2.2 取消引用函数
26.2.3 取消引用缺失的参数
Show the code
arg <- missing_arg()
expr(foo(!!arg, !!arg))
#> Error in eval(expr, envir, enclos): argument "arg" is missing, with no default
expr(foo(!!maybe_missing(arg), !!maybe_missing(arg)))
#> foo(, )
26.2.4 取消引用特殊形式函数参数
26.2.5 取消引用多个参数
unquote-splice !!!
,发音为 bang-bang-bang,一对多的替换插入
26.2.6 点-点-点 ...
与 Python 中的 args 和 kwarg(star-star-kwargs) 密切相关
Show the code
dfs <- list(
a = data.frame(x = 1, y = 2),
b = data.frame(x = 3, y = 4)
)
dplyr::bind_rows(!!!dfs)
x | y |
---|---|
1 | 2 |
3 | 4 |
Show the code
do.call("rbind", dfs)
x | y | |
---|---|---|
a | 1 | 2 |
b | 3 | 4 |
间接提供参数名称,:=
发音为 colon-equals