我正在尝试创建一个函数,我想引用之前在函数中使用{{}}和:=创建的列。如何引用“{{col}}_d”列?
library(tidyverse)
data <- tibble(
a = seq(1,10),
b = sample(c("a", "b", "c"), 10, replace = T),
c = rnorm(10, 100, 10)
)
data_func <- function(df, col) {
df %>%
group_by({{col}}) %>%
mutate(
"{{col}}_d" := a * c,
"{{col}}_e" := "{{col}}_d" * 10
)
}
data %>%
data_func(b)
#> Error in `mutate()`:
#> ℹ In argument: `b_e = "{{col}}_d" * 10`.
#> ℹ In group 1: `b = "a"`.
#> Caused by error in `"{{col}}_d" * 10`:
#> ! non-numeric argument to binary operator
#> Backtrace:
#> ▆
#> 1. ├─data %>% data_func(b)
#> 2. ├─global data_func(., b)
#> 3. │ └─... %>% ...
#> 4. ├─dplyr::mutate(...)
#> 5. ├─dplyr:::mutate.data.frame(...)
#> 6. │ └─dplyr:::mutate_cols(.data, dplyr_quosures(...), by)
#> 7. │ ├─base::withCallingHandlers(...)
#> 8. │ └─dplyr:::mutate_col(dots[[i]], data, mask, new_columns)
#> 9. │ └─mask$eval_all_mutate(quo)
#> 10. │ └─dplyr (local) eval()
#> 11. └─base::.handleSimpleError(...)
#> 12. └─dplyr (local) h(simpleError(msg, call))
#> 13. └─rlang::abort(message, class = error_class, parent = parent, call = error_call)
创建于2023年2月12日,使用reprex v2.0.2
我希望先前创建的列将用于添加的下一个新列。
3条答案
按热度按时间ghhaqwfi1#
下面是引用动态列的一种方法:
另一种方法是使用
.data
创建于2023年2月13日,使用reprex v2.0.2
wi3ka0sx2#
请使用
!!
和sym
沿着substitute
尝试以下代码创建于2023年2月12日,使用reprex v2.0.2
qco9c6ql3#
我们建议使用
englue()
创建字符串,然后将其与.data
一起使用,以从当前组切片中创建列的子集:或等同于:
参见https://rlang.r-lib.org/reference/englue.html