Ваша дочерняя функция ошибочна.Попробуйте
> child(a=1)
Error in str(a) : object 'a' not found
edit: больше не применяется.
Аргумент ... должен использоваться только для передачи параметров в следующую функцию.Вы не можете легко получить параметры оттуда, если не конвертируете их в список.Таким образом, ваша дочерняя функция может быть:
child <- function(...)
{
mc <- match.call() # or mc <- list(...)
str(mc$a)
}
Что не имеет смысла.Вы не можете знать, указал ли пользователь a
или нет.Правильный способ будет включать a
в качестве аргумента в вашу функцию....
- передать аргументы следующему:
child <- function(a, ...){
str(a,...)
}
Тогда вы можете сделать:
parent <- function(...){
mc <- match.call()
mc$toRemove <- NULL
mc[[1L]] <- as.name("child")
eval(mc)
}
или использовать конструкции list(...)
и do.call()
, предложенные @Gavin,Преимущество match.call()
состоит в том, что вы также можете включать не точечные аргументы.Это позволяет вашей родительской функции указывать значения по умолчанию для ребенка:
parent <- function(a=3, ...){
... (see above)
}