简体   繁体   English

match.call与默认参数

[英]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. 在调用函数时, formals不会更新以提供values参数值。 match.call does, but does not provide the defaults of the arguments. match.call可以,但不提供参数的默认值。 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 你可以混合使用2, match.callformals

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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