提问人:Salvador 提问时间:11/3/2023 最后编辑:Darren TsaiSalvador 更新时间:11/3/2023 访问量:52
如何将来自另一个函数的参数包含在新函数中
How to include an argument from another function into a new function
问:
我正在尝试将 tidyr 中的函数包装到我的新函数中,但忽略了一个参数。请参阅以下示例:
library(tidyr)
one2many2 <- function(data, var) {
data <- data %>%
mutate(rows = row_number()) %>%
uncount(data[, var])
return(data)
}
a <- data.frame(name = c("Maria", "Tina"), age = c(5, 3))
变量“age”应自动删除,因为这是默认值。但是,“年龄”仍显示在最终输出中。如何在我的函数中包含删除或不删除的选项?.remove = TRUE
one2many2(a, "age", .remove = TRUE) # remove = TRUE is ignored
答:
2赞
Darren Tsai
11/3/2023
#1
.remove
仅当 Data 中列的名称时才有效。您设置的内容实际上被计算为权重向量 (),而不是列的名称 ()。应使用 Embrace 运算符 {{ 来传输数据屏蔽参数。weights
weights = data[, var]
weights = c(5, 3)
weights = age
library(tidyr)
one2many2 <- function(data, var, ...){
data %>%
mutate(rows = row_number()) %>%
uncount({{ var }}, ...)
}
one2many2(a, age) # no need to quote "age"
# name rows
# 1 Maria 1
# 2 Maria 1
# 3 Maria 1
# 4 Maria 1
# 5 Maria 1
# 6 Tina 2
# 7 Tina 2
# 8 Tina 2
one2many2(a, age, .remove = FALSE)
# name age rows
# 1 Maria 5 1
# 2 Maria 5 1
# 3 Maria 5 1
# 4 Maria 5 1
# 5 Maria 5 1
# 6 Tina 3 2
# 7 Tina 3 2
# 8 Tina 3 2
评论