R:动态函数规范

问题描述 投票:0回答:1

我正在使用一个选择建模包(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 
...
}

函数的名称不需要改变,只需要改变它包含的表达式

r function dynamic expression
1个回答
0
投票

动态公式可以这样传递:

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  
© www.soinside.com 2019 - 2024. All rights reserved.