C# 中的哪种类型最像 R 中的表达式,为什么?

What type in c# is most like an expression in R and why?

作为 C# 开发人员,我对 R 的 lm 函数中的公式参数感到好奇
如以下代码

wine<-read.csv("wine_train.csv")
fit<-lm(formula=quality ~ ., data=wine)

显示的帮助中
?lm 

它说

formula
an object of class "formula" (or one that can be coerced to that class): a symbolic description of the model to be fitted.

显示的帮助中
? formula

它说

Model Formulae
The generic function formula and its specific methods provide a way of extracting formulae which have been included in other objects.

所以我对公式是 class 还是函数还是“表达式”感到困惑。

在 C# 中,我们有委托、lambda 和操作,它们似乎都有助于将代码片段视为内存变量。

R 是强类型但动态类型,而 c# 是 静态类型

R 中的公式在 C# 中是否有有用的并行?

[更新]

我知道波浪号的左右两边作为 lm 中使用的参数

从技术上讲,公式对象是一个未评估的函数调用,以及一个关联的环境:

f <- as.formula(y ~ x1 + x2)
> str(f)
Class 'formula'  language y ~ x1 + x2
  ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
> is.call(f)
[1] TRUE

y ~ x1 + x2 部分视为未评估的函数调用有点误导,因为我们通常不会像其他函数那样真正使用它。但是你可以看到它确实是这样存储的:

> f[[1]]
`~`
> f[[2]]
y
> f[[3]]
x1 + x2

即它是一个带引号的字符串和两个参数,与来自 ?call 的调用描述相匹配。当然,我们不会真正将 ~ 视为 R 中的函数,但如果您检查 help("~") 就会发现它是一个原始函数。以这种方式使用未评估的调用是 R 更独特的功能之一,因为它利用这种在语言本身上进行计算的能力来做一些名义上不相关的事情:创建一个新的“符号”对象来存储模型的概念定义。

您可以在 model.frame.default 中看到公式对象实际上是如何 使用 的,尽管该代码本身......相当密集。基本思想是 R 借助这种能力来创建具有关联环境的函数,以允许在该环境的上下文中“评估”公式,就像函数一样。但它不是“调用函数”,而是一种传输模型信息的工具,然后用于构建模型拟合过程所需的矩阵。