我正在使用一个选择建模包(apollo),它有一个需要指定为模型输入参数的一部分的函数。
我想动态指定一个函数,以便在循环的每次迭代中,使用不同的参数子集指定函数的一部分。但有一些限制。首先,我无法更改函数接受的参数。其次,该函数使用
attach
。
我认为应该有一个黑客,但我不确定它是什么!这就是我到目前为止所要做的:
for(var in c("Age", "Female") {
x <- parse(text = c("delta_a","gamma_Age_a*Age","gamma_Female_a*Female") %>%
str_subset(var, negate = TRUE) %>%
paste(collapse = "+"))
assign("dynamic_fun", function(args){
x
})
}
这里,在循环的每次迭代中,解析的表达式应如下所示:
[1] expression(delta_a+gamma_Female_a*Female)
[2] expression(delta_a+gamma_Age_a*Age)
但是它不起作用,因为函数中的
x
只是 x
而不是未计算的表达式。在现有函数中,表达式是这样指定的:
existing_fun <- function(args){
...
V=list()
V[["first"]] = delta_a + gamma_Age_a*Age + gamma_Female_a*Female
...
}
但我不明白如何在过滤公式元素时重新创建此结构......
期望的结果是创建一组如下函数的循环:
fun <- function(args){
...
V=list()
V[["first"]] = delta_a + gamma_Female_a*Female
...
}
fun <- function(args){
...
V=list()
V[["first"]] = delta_a + gamma_Age_a*Age
...
}
函数的名称不需要改变,只需要改变它包含的表达式
动态公式可以这样传递:
fun <- function(args, ...){
further_args <- list(...)
lm(formula = further_args$my_formula, data = mtcars)
}
fun
:fun(foo = pi, bar = 'a',
my_formula = as.formula(sprintf('mpg ~ %s + %s', 'cyl', 'disp'))
)
## Call:
## lm(formula = further_args$my_formula, data = mtcars)
##
## Coefficients:
## (Intercept) cyl disp
## 34.66099 -1.58728 -0.02058