Loading...
Loading...
Compare original and translation side by side
| Task | Function/Operator |
|---|---|
| Defuse your own expression | |
| Defuse user's single argument | |
Defuse user's | |
| Inject single expression | |
| Splice list of expressions | |
| Get expression from quosure | |
| Get environment from quosure | |
| Build symbol from string | |
| Build symbol with .data pronoun | |
| Build symbols from vector | |
| Auto-label expression | |
| Format argument as string | |
| Interpolate name in dynamic dots | |
| Interpolate argument in name | |
| 任务 | 函数/操作符 |
|---|---|
| 延迟求值自定义表达式 | |
| 延迟求值用户的单个参数 | |
延迟求值用户的 | |
| 注入单个表达式 | |
| 拼接注入表达式列表 | |
| 从quosure中提取表达式 | |
| 从quosure中提取环境 | |
| 从字符串构建符号 | |
| 使用.data代词构建符号 | |
| 从向量构建符号 | |
| 自动为表达式添加标签 | |
| 将参数格式化为字符串 | |
| 在动态点中插值名称 | |
| 在名称中插值参数 | |
undefinedundefinedundefinedundefined| Function | Defuses | Returns | Use When |
|---|---|---|---|
| Your own code | Expression | Building expressions locally |
| User's argument | Quosure | Forwarding function arguments |
| User's | List of quosures | Forwarding multiple arguments |
undefined| 函数 | 延迟求值对象 | 返回值 | 使用场景 |
|---|---|---|---|
| 自定义代码 | 表达式 | 本地构建表达式 |
| 用户的参数 | Quosure | 转发函数参数 |
| 用户的 | Quosure列表 | 转发多个参数 |
undefinedundefinedundefinedg <- function(...) {
vars <- enquos(..., .named = TRUE)
names(vars)
}
g(cyl, 1 + 1)
#> [1] "cyl" "1 + 1"
g(foo = cyl, bar = 1 + 1)
#> [1] "foo" "bar"g <- function(...) {
vars <- enquos(..., .named = TRUE)
names(vars)
}
g(cyl, 1 + 1)
#> [1] "cyl" "1 + 1"
g(foo = cyl, bar = 1 + 1)
#> [1] "foo" "bar"f(x, y)1 + 1xdf1"text"NULLf(x, y)1 + 1xdf1"text"NULLundefinedundefined
Without environment tracking, symbols might resolve to wrong objects when code crosses package boundaries.
如果没有环境追踪,当代码跨包边界时,符号可能会解析到错误的对象。| Situation | Use Quosure? |
|---|---|
| Defusing function arguments | Yes - use |
| Building local expressions | No - use |
| Cross-package composition | Yes - environments matter |
| Simple local evaluation | No - |
| 场景 | 是否需要Quosure? |
|---|---|
| 延迟求值函数参数 | 是 - 使用 |
| 构建本地表达式 | 否 - 使用 |
| 跨包组合代码 | 是 - 环境很重要 |
| 简单本地执行 | 否 - |
q <- enquo(x + 1)
quo_get_expr(q) # Extract expression: x + 1
quo_get_env(q) # Extract environmentq <- enquo(x + 1)
quo_get_expr(q) # 提取表达式: x + 1
quo_get_env(q) # 提取环境undefinedundefined{{{{!!enquo(arg)undefined!!enquo(arg)undefined
Use `{{` when you simply need to forward an argument. Use `enquo()` + `!!` when you need to inspect or transform the expression first.
当仅需转发参数时使用`{{`。当需要先检查或转换表达式时,使用`enquo()` + `!!`。!!!!var <- expr(cyl)
mtcars |> dplyr::summarise(mean(!!var))
#> Equivalent to: summarise(mean(cyl))var <- expr(cyl)
mtcars |> dplyr::summarise(mean(!!var))
#> 等效于: summarise(mean(cyl))undefinedundefined!!!!!!vars <- exprs(cyl, am, vs)
mtcars |> dplyr::select(!!!vars)
#> Equivalent to: select(cyl, am, vs)vars <- exprs(cyl, am, vs)
mtcars |> dplyr::select(!!!vars)
#> 等效于: select(cyl, am, vs)undefinedundefined!!!{name}list2()undefined!!!{name}list2()undefinedundefinedundefinedvar <- "cyl"
sym(var)
#> cyl
vars <- c("cyl", "am")
syms(vars)
#> [[1]]
#> cyl
#> [[2]]
#> amvar <- "cyl"
sym(var)
#> cyl
vars <- c("cyl", "am")
syms(vars)
#> [[1]]
#> cyl
#> [[2]]
#> am.data$coldata_sym("cyl")
#> .data$cyl
data_syms(c("cyl", "am"))
#> [[1]]
#> .data$cyl
#> [[2]]
#> .data$amsym()data_sym().data$coldata_sym("cyl")
#> .data$cyl
data_syms(c("cyl", "am"))
#> [[1]]
#> .data$cyl
#> [[2]]
#> .data$amsym()data_sym()undefinedundefinedundefinedundefined{{}name <- "foo"
tibble::tibble("{name}" := 1:3)
#> # A tibble: 3 x 1
#> foo
#> <int>
#> 1 1
#> 2 2
#> 3 3
tibble::tibble("prefix_{name}" := 1:3)
#> Column named: prefix_fooname <- "foo"
tibble::tibble("{name}" := 1:3)
#> # A tibble: 3 x 1
#> foo
#> <int>
#> 1 1
#> 2 2
#> 3 3
tibble::tibble("prefix_{name}" := 1:3)
#> 列名为: prefix_foo{{{{}}my_mutate <- function(data, var) {
data |> dplyr::mutate("mean_{{ var }}" := mean({{ var }}))
}
mtcars |> my_mutate(cyl)
#> Creates column: mean_cylmy_mutate <- function(data, var) {
data |> dplyr::mutate("mean_{{ var }}" := mean({{ var }}))
}
mtcars |> my_mutate(cyl)
#> 创建列: mean_cylmy_function <- function(var) {
englue("Column: {{ var }}")
}
my_function(some_column)
#> [1] "Column: some_column"my_function <- function(var) {
englue("Column: {{ var }}")
}
my_function(some_column)
#> [1] "Column: some_column"my_mean <- function(data, var) {
# 1. Defuse
var <- enquo(var)
# 2. Transform: wrap in mean()
wrapped <- expr(mean(!!var, na.rm = TRUE))
# 3. Inject
data |> dplyr::summarise(mean = !!wrapped)
}my_mean <- function(.data, ...) {
vars <- enquos(..., .named = TRUE)
# Transform each expression
vars <- purrr::map(vars, ~ expr(mean(!!.x, na.rm = TRUE)))
.data |> dplyr::summarise(!!!vars)
}my_mean <- function(data, var) {
# 1. 延迟求值
var <- enquo(var)
# 2. 转换:用mean()包裹
wrapped <- expr(mean(!!var, na.rm = TRUE))
# 3. 注入
data |> dplyr::summarise(mean = !!wrapped)
}my_mean <- function(.data, ...) {
vars <- enquos(..., .named = TRUE)
# 转换每个表达式
vars <- purrr::map(vars, ~ expr(mean(!!.x, na.rm = TRUE)))
.data |> dplyr::summarise(!!!vars)
}| rlang | Base R | Notes |
|---|---|---|
| | bquote uses |
| | substitute returns naked expr, not quosure |
| | Workaround for dots |
| | Only inside bquote |
| | eval_tidy supports .data/.env pronouns |
| rlang | 基础R | 说明 |
|---|---|---|
| | bquote使用 |
| | substitute返回裸表达式,而非Quosure |
| | 处理可变参数的变通方法 |
| bquote中的 | 仅在bquote内生效 |
| | eval_tidy支持.data/.env代词 |
{{{{undefined{{}}undefinedundefinedundefined| Operator | Intended | Outside Context |
|---|---|---|
| Embrace | Double braces (returns value) |
| Inject | Double negation (logical) |
| Splice | Triple negation (logical) |
| 操作符 | 预期用途 | 非目标上下文含义 |
|---|---|---|
| Embrace | 双大括号(返回值) |
| 注入 | 双重否定(逻辑运算) |
| 拼接 | 三重否定(逻辑运算) |
undefinedundefinedundefinedundefined