简体   繁体   中英

match.call with default arguments

As part of a function, I want to output a list of all the arguments and their values, including the default values. For example, a function with these arguments:

foo <- function(x=NULL,y=NULL,z=2) {
  #formals()
  #as.list(match.call())[-1]
  #some other function?....
}

To give output as such:

> foo(x=4)

$x
[1] 4

$y
NULL

$z
[1] 2

formals does not update to give the values argument values when the function is called. match.call does, but does not provide the defaults of the arguments. Is there another function out there that will provide the output as I want?

Hopefully, this doesn't lead to dragons.

foo <- function(x=NULL,y=NULL,z=2) {
  mget(names(formals()),sys.frame(sys.nframe()))

}

foo(x=4)

$x
[1] 4

$y
NULL

$z
[1] 2

print(foo(x=4))

$x
[1] 4

$y
NULL

$z
[1] 2

you can use a mix of the 2 , match.call and formals

foo <- function(x=NULL,y=NULL,z=2)
{
  ll <- as.list(match.call())[-1]     ## 
  myfor <- formals(foo)               ## formals with default arguments
  for ( v in names(myfor)){
             if (!(v %in% names(ll)))
                ll <- append(ll,myfor[v])  ## if arg is missing I add it
             }
  ll
}

For example :

  foo(y=2)
$y
[1] 2

$x
NULL

$z
[1] 2

> foo(y=2,x=1)
$x
[1] 1

$y
[1] 2

$z
[1] 2

Here is an attempt to wrap this logic in a reusable function to drop in instead of match.call :

match.call.defaults <- function(...) {
  call <- evalq(match.call(expand.dots = FALSE), parent.frame(1))
  formals <- evalq(formals(), parent.frame(1))

  for(i in setdiff(names(formals), names(call)))
    call[i] <- list( formals[[i]] )


  match.call(sys.function(sys.parent()), call)
}

It looks like it works:

foo <- function(x=NULL,y=NULL,z=2,...) {
  match.call.defaults()
}


> foo(nugan='hand', x=4)
foo(x = 4, y = NULL, z = 2, ... = pairlist(nugan = "hand"))
 foo <- function(x=NULL,y=NULL,z=2) {
   X <- list(x,y,z); names(X) <- names(formals()); X
 }
 z <- foo(4)
 z
#------
$x
[1] 4

$y
NULL

$z
[1] 4

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM