【发布时间】:2015-01-25 22:56:18
【问题描述】:
我想知道 R 如何将环境绑定到公式的一些细节,以及在不同情况下对所述环境的要求,特别是公式中不包含 ~ 是否打开。
假设我有两个像字符串一样的公式,它们通常是通过编程方式创建的,但为简单起见,我只定义为文字:
$ formula_str_no_tilde <- "a + b"
$ formula_str_with_tilde <- "~ a + b"
我打算使用这些从包含 a 和 b 列的数据框中进一步创建模型矩阵。为此,我想将类似公式的字符串转换为合法公式。这是非常奇怪的不同行为的地方:
$ formula_no_tilde <- as.formula(formula_str_no_tilde)
> Error in eval(expr, envir, enclos) : object 'a' not found
同时:
$ formula_with_tilde <- as.formula(formula_str_with_tilde)
no error
查看 as.formula 的文档,有一个 env 参数用于将环境绑定到公式。这个参数默认绑定全局环境,这对错误消息有一定的意义,因为我们在全局环境中没有'a'。不过,它确实使接受第二次调用 as.formula 变得神秘,因为我们处于同样的情况......
由于全球环境是绑定的,人们会理智地怀疑这整个冒险可能被误导了,我们将无法在以后使用我们的 formula_with_tilde 来制作模型矩阵,因为全球环境已经边界。尽管如此:
$ D <- data.frame('a'=c(1, 2, 3), 'b'=c(-1, 0, 1))
$ model.matrix(formula_with_tilde, D)
如您天真希望的那样工作。可能这是model.matrix的一个特性,它为你重新绑定了环境……
所以这是我的问题:
- 在 R 中没有波浪线的公式是否非法?有没有什么情况是有意义的?
- 为什么不包含波浪号会引发环境查找错误,而包含它却不会?
- model.matrix 是否重新绑定与公式关联的环境?
为了完整性:
- 有没有更好的专业人士开始以编程方式生成和操作公式?
【问题讨论】:
-
您不妨阅读
help(formula)的详细信息部分。信息量很大 -
波浪号是返回调用对象的前缀或中缀函数。
标签: r