gpt4 book ai didi

r - 使用可选的非默认参数以编程方式创建 R 函数

转载 作者:行者123 更新时间:2023-12-04 11:42:56 27 4
gpt4 key购买 nike

How to create an R function programmatically?

我想从它们的组件中构建 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
}

但如果一个或多个 args 没有默认参数,它将不起作用:
testfn(x = 4, y, expression = {
y <- y + 2
x + y
})

=>
Error in eval(expr, envir, enclos) :
invalid formal argument list for "function"

我可以放 =在 arg 列表中使其工作:
testfn(x = 4, y = , expression = {
y <- y + 2
x + y
})

=>
function (x = 4, y)
{
y <- y + 2
x + y
}

但我不想在函数参数中强制执行这一点。我尝试在函数中编辑 alist,但是当我这样做时,我收到另一个无效的形式参数列表错误:
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 从一个字符串构造一个新的列表。但这将意味着我不能拥有例如函数作为参数。

最佳答案

这是一种不太优雅的方法:

testfn <- function(..., expression){
args <- eval(substitute(alist(...)))
body <- substitute(expression)

## Fix for missing default values
tmp <- names(args)
if (is.null(tmp)) tmp <- rep("", length(args))
names(args)[tmp==""] <- args[tmp==""]
args[tmp==""] <- list(NULL)

eval(call("function", as.pairlist(args), body), parent.frame())
}

关于r - 使用可选的非默认参数以编程方式创建 R 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30662924/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com