Я хочу получить список аргументов, используемых в 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. Любые идеи?

r
2
nachocab 25 Май 2013 в 23:19

1 ответ

Лучший ответ

Похоже, некоторым людям нужен способ создания списка, загруженного всем: позиционными, именованными и ... аргументами. Я уверен, что должны быть крайние случаи, но это может быть умеренно многоразовое решение:

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

Совет шляпе:

4
Community 23 Май 2017 в 13:27