Как не учитывать (в операторе фильтра) отсутствующий аргумент в функции R - PullRequest
2 голосов
/ 17 июня 2019

Я пытаюсь отфильтровать набор данных в функции. Я хотел бы отфильтровать этот набор данных только с учетом аргументов, переданных в функцию, пропуская тот, который отсутствует

Я пробовал с процессом 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

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Хотя и немного более многословно, вы можете сделать следующее:

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
0 голосов
/ 17 июня 2019

Попробуйте это:

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...