【发布时间】:2021-11-05 14:00:48
【问题描述】:
使用这个函数foo()。我希望它有一个默认参数cyl,因为这是它通常会处理的字段的名称。
library(tidyverse)
foo <- function(x = cyl){
case_when(
x == 6 ~ TRUE,
x == 8 ~ FALSE,
x == 4 ~ NA
)
}
# works:
mtcars %>%
mutate(cyl_refactor = foo(cyl)) %>%
select(cyl, cyl_refactor)
但令我惊讶的是,除非我明确提供默认参数,否则该函数将无法工作。请参阅下面的失败代码
# fails:
mtcars %>%
mutate(cyl_refactor = foo()) %>%
select(cyl, cyl_refactor)
Error: Problem with `mutate()` column `cyl_refactor`. ℹ `cyl_refactor = foo()`. x object 'cyl' not found
似乎只有当还有如下数据参数时才会处理默认参数。
foo2 <- function(data, x = cyl){
data %>%
mutate(cyl_refactor = case_when(
{{x}} == 6 ~ TRUE,
{{x}} == 8 ~ FALSE,
{{x}} == 4 ~ NA
))
}
mtcars %>%
foo2() %>%
select(cyl, cyl_refactor)
我确信我在准引用方面的知识存在一些差距,但我想了解如何在 foo() 中使用默认参数。
【问题讨论】:
-
这显然只是示例代码,有没有办法为 foo() 提供默认参数?我是否需要使用带引号的列名,如果需要,case_when() 可以处理带引号的列名吗?
-
在我的实际用例中,最好避免使用数据参数
-
所以当我尝试 sym() 方法时出现错误:只有字符串可以转换为符号 retain_92dv2 duration & is.na(!!cancel_date) ~ TRUE, # 烘焙 + 不取消 = 保留 !!cancel_date - !!gns_date > duration ~ TRUE, !!cancel_date - !!gns_date
-
是这个主意吗?传递带引号的参数,然后在函数中使用 arg
标签: r dplyr quasiquotes