我试图了解使用波浪号运算符和相关函数。我的第一个问题是为什么需要使用I()
来指定算术运算符?例如,这2个图产生不同的结果(前者有一条直线,后者有预期的曲线)
x <- c(1:100)
y <- seq(0.1,10,0.1)
plot(y~x^3)
plot(y~I(x^3))
此外,以下两个图也产生预期结果
plot(x^3, y)
plot(I(x^3), y)
我的第二个问题是,也许我一直在使用的例子太简单了,但我不明白~
应该在哪里使用。
这里的问题是如何解释公式。中缀运算符“+”,“*”,“:”和“^”具有与使用数字向量时完全不同的含义。在公式中,波浪号将左手侧与右手侧分开。在公式中,^
算子用于构造相互作用,使得x
= x^2
= x^3
而不是可能预期的数学能力。 (与自身交互的变量就是同一个变量。)如果你输入了(x+y)^2
,R解释器就会生成(为了它自己的内部使用),而不是数学:x^2 +2xy +y^2
,而是一个符号:x + y +x:y
,其中x:y
是一个交互术语。
?formula
I()
函数用于将参数转换为“as.is”,即您所期望的。所以我(x ^ 2)将返回一个值向量提升到二次幂。
当在回归函数中看到时,~
应该被认为是“分布为”或“依赖于”。它意味着模型描述中的错误术语通常标记为“(拦截)”,并且函数上下文和参数还可以进一步确定链接函数,例如log()或logit()。
公式中的“+”符号实际上并未添加两个变量,但通常是隐式请求,用于在公式的RHS上的其余变量的上下文中计算该变量的回归系数。回归函数使用`model.matrix,该函数将识别公式中因子或字符向量的存在,并构建一个矩阵,扩展公式的离散组件的级别。
在plot() - ting函数中,它基本上颠倒了绘图函数通常采用的通常的( x, y )
参数顺序。编写了plot.formula方法,以便公式可以用作与R通信的更“数学”模式。在graphics::plot.formula
,curve
,以及'lattice'和'ggplot'函数中,它控制多个因子或数字向量的方式显示并“刻面”。
我后来才知道~
实际上是一个中缀(或前缀)原始函数,它创建一个R'调用',可以使用列表提取操作符访问它。所有这些都是典型用户隐藏的,但它可以是更高级的函数作者使用的工具。
“+”运算符的重载在下面的注释中讨论,并且也在绘图包中完成:ggplot2和gridExtra,它分隔了传递对象结果的函数,因此它起作用,并作为传递和分层运算符。具有公式方法的聚合函数使用“+”作为“排列”和分组运算符。