如何获取函数使用的参数列表?

时间:2013-05-25 19:19:15

标签: r

我想获得my_fun中使用的参数列表,不包括点和第一个参数。我还想拥有可选参数的默认值。这就是我目前正在做的事情,但我确信有一种更简单的方法:

my_fun <- function(a, b = "b", c = "c", d = c("d1","d2"), ...){
    my_call <- as.list(match.call(expand.dots = FALSE))[-1]
    my_call[names(my_call) %in% c("a","...")] <- NULL

    my_formals <- as.list(formals("my_fun"))
    my_formals[names(my_formals) %in% c("a","...")] <- NULL
    for (arg in names(my_call)){
        my_formals[[arg]] <- my_call[[arg]]
    }
    my_formals$d <- eval(my_formals$d)
    my_formals
}

res <- my_fun("a", c = 3, e = 3, f = 5)
res
# list(b = "b", c = 3, d = c("d1","d2"))

请注意,因为我正在使用formals,所以我必须做一个尴尬的eval。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

似乎有些人想要一种方法来构建一个加载了所有内容的列表:位置,命名和...参数。我确信必须有边缘情况,但这可能是一个适度可重复使用的解决方案:

expand.args <- function() {
  named_args <- as.list(parent.frame())
  dot_args <- as.list(substitute(list(...), parent.frame()))[-1L]
  c(named_args, dot_args)
}

在你的情况下(你要删除第一个参数的地方)你可以这样做:

my_fun <- function(a, b = "b", c = "c", d = c("d1", "d2"), ...) {
  my_args <- expand.args()[-1L]
  return(my_args)  
}

my_fun("a", 3, x = "woot")

帽子提示: