如何将来自另一个函数的参数包含在新函数中

How to include an argument from another function into a new function

提问人:Salvador 提问时间:11/3/2023 最后编辑:Darren TsaiSalvador 更新时间:11/3/2023 访问量:52

问:

我正在尝试将 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
r tidyr

评论

1赞 Derf 11/3/2023
我想我更好奇为什么它没有抛出“ 未使用的参数 '.remove=TRUE' ”,因为它没有在 one2many 中定义

答:

2赞 Darren Tsai 11/3/2023 #1

.remove仅当 Data 中列的名称时才有效。您设置的内容实际上被计算为权重向量 (),而不是列的名称 ()。应使用 Embrace 运算符 {{ 来传输数据屏蔽参数。weightsweights = 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