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

sim*_*ple 5 r function formula dataframe

我有一个函数需要将 a作为输入,例如以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)
Run Code Online (Sandbox Code Playgroud)
  • 我尝试使用 nls2,但我没有任何参数可以优化,所以我不明白这一点。

我可以用什么来实现这个目的?

以下是我查阅的资源:
如何将公式应用于 R 中的向量?

将公式传递给 R 中的函数?

Thi*_*ilo 5

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

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

as.function <- function(formula) {
    cmd <- tail(as.character(formula),1)
    exp <- parse(text=cmd)
    function(...) eval(exp, list(...))
}
Run Code Online (Sandbox Code Playgroud)

但请注意,有些有效公式可能无法以这种方式计算,例如y ~ a:c

这给了我们

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

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

as.function <- function(formula) {
    cmd <- tail(as.character(formula),1)
    exp <- parse(text=cmd)
    function(df) eval(exp, df)
}
Run Code Online (Sandbox Code Playgroud)

并得到

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