我正在尝试过滤函数中的数据集。我想只在考虑函数中传递的参数的情况下过滤这个数据集,省略缺少的参数
我已经尝试过 match.call(( - do.call(( 进程,但它不起作用,我认为我用错了它。有人可以帮助我解决我的问题吗?
people = data.frame(SEX = c("F", "H", "F", "F"),
ADULT = c(1,1,1,0))
f = function(dataset, sex = NULL, adult = NULL){
data <- dataset%>%filter(SEX == sex & ADULT == adult)
return(data)}
f(dataset = people, sex = "F", adult = 1)
g = function(dataset, sex, age){
argList <- as.list(match.call(expand.dots = TRUE)[-1])
# Enforce inclusion of non-optional arguments
argList$dataset <- dataset
do.call(f,argList)}
g(dataset = people, sex = "F")
调用函数 f 的输出为:
SEX ADULT
1 F 1
2 F 1
这就是我想要的。但我希望f(dataset = people, sex = "F")
的输出是:
SEX ADULT
1 F 1
2 F 1
3 F 0
试试这个:
f <- function(dataset, sex = NULL, adult = NULL){
cond1 <- if (!is.null(sex)) quote(SEX==sex) else TRUE
cond2 <- if (!is.null(adult)) quote(ADULT==adult) else TRUE
data <- dataset %>% filter(!!(cond1) & !!(cond2))
return(data)
}
虽然有点冗长,但您可以执行以下操作:
people <- data.frame(SEX = c("F", "H", "F", "F"),
ADULT = c(1,1,1,0))
f <- function(dataset, sex = "NULL", adult = "NULL")
{
if(sex != "NULL"){ data <- dataset%>%filter(SEX == sex)}
if(adult != "NULL"){ data <- dataset%>%filter(ADULT == adult)}
return(data)
}
f(people, sex = "F")
输出将是:
SEX ADULT
1 F 1
2 F 1
3 F 0