Исходя из How to create an R function programmatically?Создать функцию R программно с помощью дополнительных нестандартных аргументов
Я хочу построить функции R из их компонентов, как это:
testfn <- function(..., expression){
args <- substitute(alist(...))
body <- substitute(expression)
eval(call("function", as.pairlist(eval(args)), body), parent.frame())
}
Это прекрасно работает, если есть значения по умолчанию:
testfn(x = 4, y = 5, expression = {
y <- y + 2
x + y
})
=>
function (x = 4, y = 5)
{
y <- y + 2
x + y
}
Но это не будет работать, если нет по умолчанию аргумента для одного или нескольких аргументов:
testfn(x = 4, y, expression = {
y <- y + 2
x + y
})
=>
Error in eval(expr, envir, enclos) :
invalid formal argument list for "function"
Я могу поставить =
в списке агда, чтобы получить эту работу:
testfn(x = 4, y = , expression = {
y <- y + 2
x + y
})
=>
function (x = 4, y)
{
y <- y + 2
x + y
}
Но я не хочу, чтобы обеспечить соблюдение этого в аргументах функции. Я попытался отредактировать ассоциативный список в функции, но когда я делаю это, я получаю другую неверную формальную ошибку списка аргументов:
testfn2 <- function(..., expression){
args <- substitute(alist(...))
body <- substitute(expression)
for (arg in 2:length(args)){
if(names(myargs)[arg] == ""){
args[[arg]] <- as.name(paste(as.character(args)[arg], "="))
}
}
eval(call("function", as.pairlist(eval(args)), body), parent.frame())
}
testfn2(x = 4, y, expression = {
y <- y + 2
x + y
})
=>
Error in eval(expr, envir, enclos) :
invalid formal argument list for "function"
Как я могу изменить это, так что я могу назвать testfn() с отсутствующими аргументами по умолчанию? Я думал о построении нового алиста из символьной строки, используя parse
, но это будет означать, что у меня не может быть, например, функции в качестве аргументов.
Вы пытались с 'missing (y)'? чтобы проверить, присутствует ли 'y' в вызове. –
Проблема заключается в том, чтобы сделать вызов, при построении форматов для новой функции. – dspringate