2

我想获取用于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. 有任何想法吗?

4

1 回答 1

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")

帽子提示:

于 2013-05-25T19:58:58.643 回答