Search code examples
rfunctionmatchapply

Error in using match.arg for multiple arguments


I am new to using match.arg for default value specification in R functions. And I have a query regarding the below behavior.

trial_func <- function(a=c("1","9","20"),b=c("12","3"),d=c("55","01")){
  a <- match.arg(a)
  b <- match.arg(b)
  d <- match.arg(d)
  list(a,b,d)
}
trial_func()
# [[1]]
# [1] "1"
# 
# [[2]]
# [1] "12"
# 
# [[3]]
# [1] "55"

When I try using match.arg for each individual argument, it works as expected. But when I try to use an lapply to reduce the code written, it causes the below issue.

trial_func_apply <- function(a=c("1","9","20"),b=c("12","3"),d=c("55","01")){
  lapply(list(a,b,d), match.arg)
}
trial_func_apply()

Error in FUN(X[[i]], ...) : 'arg' must be of length 1

Am I missing something here?


Solution

  • After investigating a bit, you need to pass the argument that your character vector is NULL, i.e.

    trial_func_apply <- function(a=c("1","9","20"),b=c("12","3"),d=c("55","01")){
         lapply(list(a,b,d), function(i)match.arg(NULL, i))
     }
    
    trial_func_apply()
    #[[1]]
    #[1] "1"
    
    #[[2]]
    #[1] "12"
    
    #[[3]]
    #[1] "55"