建筑表达式在R中是相对直接的,其功能类似于as.call
和bquote
以及函数是R中第一类对象的事实。使用动态特征构建函数有点棘手。这里有一些可能帮助的功能
to_params <- function(l) {
z <- as.list(l)
setNames(lapply(names(z), function(x) bquote(args[[.(x)]])), names(z))
}
add_exprs <- function(...) {
x <- list(...)
Reduce(function(a,b) bquote(.(a) + .(b)), x)
}
get_densities <- function(f) {
lapply(paste0("d", f), as.name)
}
weight_expr <- function(w, e) {
bquote(.(w) * .(e))
}
add_params <- function(x, p) {
as.call(c(as.list(x), p))
}
call_with_x <- function(fn) {
as.call(list(fn, quote(x)))
}
fitmix <- function(data, dist, params, weights) {
fb <- Reduce(add_exprs, Map(function(d, p, w) {
weight_expr(w, add_params(call_with_x(d), to_params(p)))
}, get_densities(dist), params, weights))
f <- function(x, args) {}
body(f) <- fb
f
}
请注意,我更改了一些参数的类型。分布应该是字符串。参数应该是一个命名向量的列表。它将与受理工作,这样
ff <- fitmix(data, dist=c("norm","chisq"), params=list(c(mean=0,sd=3),c(df=2)),
weights=c(0.5,0.5))
它返回一个函数,它的x
和命名参数列表。你可以把它像
ff(0, list(mean=3, sd=2, df=2))
# [1] 0.2823794
返回相同的值
x <- 0
0.5 * dnorm(x, mean = 3, sd = 2) + 0.5 * dchisq(x, df = 2)
# [1] 0.2823794
你有没有尝试什么吗?这基本上就像是一个“请为我编码”这个问题,在本网站不鼓励。如果您可以提出更具体的问题或至少显示您尝试过的代码,那可以改善您的问题。 – MrFlick
这个例子是真实任务的简化版本,所以我的代码对这个问题没有帮助。我可以使用lapply(seq_along(D),function(i)paste(dist [i],paste(“(x,”,paste(names(params [[i]))粘贴来创建调用,崩溃=“,”),“)”,sep =“”),sep =“”))+将它们粘贴在一起,并尝试as.call,但没有任何好的结果 –