如何将公式转换为函数,或者将公式应用于某些数值?

5
我有一个函数需要接收一个公式作为输入,格式为y~x。然后,我需要将一系列的x值传入该公式中,以计算出相应的y值。例如,如果我的公式是y~x^2,而我的一组x值是(1,2,3,4),那么我应该期望得到输出结果为(1,4,9,16)。
假如我的公式长这样:formula1 <- y~x
至此,我尝试了以下方法:
- 将公式转换成函数:as.function(formula1) - 使用model.framemodel.matrix
formula1 <- y~x^2 
x <- c(1,2,3,4)
my_data <- data.frame("x" = x, "y" = rep(0,length(x))) 
model_frame <- model.frame(formula1, data = my_data)
my_design_matrix <- model.matrix(formula1, model_frame)
  • 我尝试使用nls2,但是我没有任何需要优化的参数,所以我看不到它的点。

有什么替代方案吗?

这是我参考的资源:
如何在R中将公式应用于向量?

在R中传递公式给函数?

2个回答

5
我不确定这是否是最优雅的方法,但它应该符合您的要求:
思路是提取公式对象的右侧并将其解析为字符串。然后可以评估结果。
as.function <- function(formula) {
    cmd <- tail(as.character(formula),1)
    exp <- parse(text=cmd)
    function(...) eval(exp, list(...))
}

请注意,有些有效的公式可能无法通过这种方式进行评估,例如y ~ a:c
这给我们带来了。
> f <- as.function(y ~ x^2)
> f(x=1:10)
 [1]   1   4   9  16  25  36  49  64  81 100

如果您想向生成的函数提交一个数据框,只需执行以下操作:
as.function <- function(formula) {
    cmd <- tail(as.character(formula),1)
    exp <- parse(text=cmd)
    function(df) eval(exp, df)
}

并获得

> f <- as.function(y ~ x^2)
> f(data.frame(x=1:10))
 [1]   1   4   9  16  25  36  49  64  81 100

1

purrr::as_mapper 将单侧公式映射为函数:

fn <- as_mapper(~ .^2)
fn(2) # gives 4 

as_mapper(\(x){x^2})也可以工作,这样你就可以创建接受公式或函数的函数。

my_func <- \(x,fn){ as_mapper(fn)(x) }
my_func(2,~.^2)      # gives 4
my_func(2,\(x){x^2}) # gives 4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接