(注意:这不是对原始问题的直接回答。由于我没有足够的声誉来发表评论,而且我认为下面的信息很有用,我还是把它作为答案。如果有请告诉我更好的方法!)
尽管您不能直接使用:=
as=
或<-
,但该:=
运算符在使用使用非标准评估 (NSE) 的领域特定语言 (DSL) 进行编程时非常有用,例如dplyr
and data.table
。下面是一个例子:
library(dplyr)
df <- tibble(
g1 = c(1, 1, 2, 2, 2),
g2 = c(1, 2, 1, 2, 1),
a = sample(5),
b = sample(5)
)
my_mutate <- function(df, expr) {
expr <- enquo(expr)
mean_name <- paste0("mean_", quo_name(expr))
sum_name <- paste0("sum_", quo_name(expr))
mutate(df,
!! mean_name := mean(!! expr),
!! sum_name := sum(!! expr)
)
}
my_mutate(df, a)
#> # A tibble: 5 x 6
#> g1 g2 a b mean_a sum_a
#> <dbl> <dbl> <int> <int> <dbl> <int>
#> 1 1. 1. 1 3 3. 15
#> 2 1. 2. 4 2 3. 15
#> 3 2. 1. 2 1 3. 15
#> 4 2. 2. 5 4 3. 15
#> # ... with 1 more row
在上面的示例中,:=
在my_mutate
函数中替换=
不起作用,因为!! mean_name = mean(!! expr)
不是有效的 R 代码。
dplyr
您可以在此处阅读有关 NSE 和编程的更多信息。它很好地解释了在使用dplyr
函数编写自己的函数时如何处理 NSE。我上面的例子是直接从网站上复制的。