我正在尝试从函数列表和要传递给这些函数的参数列表中创建新函数,但到目前为止我无法这样做。请参阅下面的示例。
public class WebApiAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(HttpActionContext ctx)
{
if (!ctx.RequestContext.Principal.Identity.IsAuthenticated)
base.HandleUnauthorizedRequest(ctx);
else
{
// Authenticated, but not AUTHORIZED. Return 403 instead!
ctx.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden);
}
}
}
目标是动态地为任意函数和参数执行此操作。
答案 0 :(得分:7)
好吧,force()
在for循环中不起作用,因为for循环不会创建新的环境。基于我的previous question,我创建了一个capture()
函数
capture <- function(...) {
vars <- sapply(substitute(...()), deparse);
pf <- parent.frame();
Map(assign, vars, mget(vars, envir=pf, inherits = TRUE), MoreArgs=list(envir=pf))
}
这允许
for(x in names(fun_list)) {
f = local({
capture(x);
p = params_list[[x]];
f = fun_list[[x]];
function(x) f(x, p)
})
assign(paste0(x, "new"), f)
}
我们为函数创建一个本地私有环境来存储它们的默认参数值。
哪个给出了
fnew(2)
# [1] 3
znew(2)
# [1] 30
答案 1 :(得分:2)
这个怎么样:
for(x in names(fun_list)) {
formals(fun_list[[x]])$params <- params_list[[x]]
assign(paste0(x, "new"), fun_list[[x]])
}
答案 2 :(得分:1)
这在精神上类似:
ps <- list(fp=1,zp=c(3,5))
f0s <- substitute(list(f=function(x)x+fp,z=function(a)a*zp1*zp2),as.list(unlist(ps)))
f0s # list(f = function(x) x + 1, z = function(a) a * 3 * 5)
fs <- eval(f0s)
fs$f(1) # 2
要做OP中描述的花哨的事情,你可能不得不混淆formals
。