Рассмотрим функцию
f <- function(x, X) mean(c(x,X))
Как я могу автоматически (манипуляцией f()
) изменить подпись f()
так, чтобы ее можно было использовать с lapply()
, т. Е. Без возвратаследующая очевидная ошибка?
lapply(X=list(1), FUN=f, X=1)
Error in lapply(X = list(1), FUN = f, X = 1) :
formal argument "X" matched by multiple actual arguments
Подход, который я до сих пор использовал, состоит в том, чтобы удалить все аргументы из f()
, назначить их в среду и оценить f()
в этой среде.
integrateArgs <- function (f, args)
{
form <- formals(f)
if (!is.null(form))
for (i in seq_along(form)) assign(names(form)[i], form[[i]])
if (!is.null(args))
for (i in seq_along(args)) assign(names(args)[i], args[[i]])
ff <- function() {
}
parent.env(environment(ff)) <- parent.env(environment(f))
body(ff) <- body(f)
if (any(names(form) == "..."))
formals(ff) <- form[names(form) == "..."]
ff
}
fnew <- integrateArgs(f, list(x=1, X=4))
lapply(list(fnew), function(x) x())
[[1]]
[1] 2.5
Однако такой подход приводит к следующей ошибке, если f()
является функцией из другого пакета R, который вызывает скомпилированный код.
fnew2 <- integrateArgs(dnorm, list(x=1, mean=4))
lapply(list(fnew2), function(x) x())
Error in x() (from #1) : object 'C_dnorm' not found
Есть ли лучшие решения?