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

时间:2016-04-17 18:51:32

标签: r function dataframe formula

我有一个需要的功能,期望formula作为输入,例如以y~x的形式。然后,我需要将一系列x-values传递给该公式以获取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,但我没有任何参数可以优化,所以我没有看到这一点。

我可以用它做什么?

以下是我咨询过的资源:
How to apply a formula to a vector in R?

Pass formula to function in R?

1 个答案:

答案 0 :(得分:2)

我不确定这是否是最优雅的方式,但它应该按照您的要求进行:

这个想法是提取公式对象的右侧并将其解析为字符串。然后可以评估结果。

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

如果您想向生成的函数提交data.frame,您可以这样做

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