如何不考虑(在过滤器语句中)函数 R 中缺少的参数



我正在尝试过滤函数中的数据集。我想只在考虑函数中传递的参数的情况下过滤这个数据集,省略缺少的参数

我已经尝试过 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

最新更新