【发布时间】:2015-10-30 02:32:18
【问题描述】:
如何在R中将c("x","y","z")之类的向量转换为function(x , y, z){}?
我正在寻找类似formalArgs() 的反向功能。
请注意,我知道as.function(alist(x=,y=,{})),但我不知道如何从给定向量中插入x= 和y=。
【问题讨论】:
标签: r function vector arguments
如何在R中将c("x","y","z")之类的向量转换为function(x , y, z){}?
我正在寻找类似formalArgs() 的反向功能。
请注意,我知道as.function(alist(x=,y=,{})),但我不知道如何从给定向量中插入x= 和y=。
【问题讨论】:
标签: r function vector arguments
基本上要让它工作,你需要打电话
as.function(alist(x=, y=, z=, {}))`
相当于
as.function(alist(x=bquote(), y=bquote(), z=bquote(), {}))
第二种形式很好,因为我们有一组alist 的命名参数,可以使用列表和do.call 以编程方式提供:
l <- list(x=bquote(), y=bquote(), z=bquote(), bquote({}))
as.function(do.call(alist, l))
# function (x, y, z)
# {
# }
剩下的就是从变量名列表中以编程方式构造我们的列表l,这可以使用setNames和replicate来完成:
vec <- c("x","y","z")
as.function(do.call(alist, c(setNames(replicate(length(vec), bquote(), F), vec),
bquote({}))))
# function (x, y, z)
# {
# }
【讨论】:
参数只是一个命名列表。对内部配对列表的强制是自动的。
#argument list
p<-c("x","y","z")
args<-vector("list",length(p))
for(i in seq(args)) args[[i]]<-substitute()
names(args)<-p
#set a default value for y for the sake of example
args$y<-2
#construct function
body<-quote(x+y+z)
f<-as.function(c(args,body))
#test it
f(1,z=3)
#[1] 6
【讨论】: