为什么这不会导致错误?
> str(u)
'data.frame': 8879 obs. of 2 variables:
$ bundle_qty: int 1 1 1 1 1 1 1 1 1 1 ...
$ mail_a : num 1 1 1 1 0 0 0 1 1 0 ...
> head(u$mail)
[1] 1 1 1 1 0 0
Run Code Online (Sandbox Code Playgroud)
变量mail不在data.frame中u!不应该u$mail回来NULL?
即使我从头开始使用虚拟数据:
> rm(list=ls())
> u <- data.frame( bundle_qty = c(1,1,1,1), mail_a = c(1,1,1,1))
> str(u)
'data.frame': 4 obs. of 2 variables:
$ bundle_qty: num 1 1 1 1
$ mail_a : num 1 1 1 1
> u <- data.frame( bundle_qty = c(1L,1L,1L,1L), mail_a = c(1,1,1,1))
> str(u)
'data.frame': 4 obs. of 2 variables:
$ bundle_qty: int 1 1 1 1
$ mail_a : num 1 1 1 1
> u$mail
[1] 1 1 1 1
Run Code Online (Sandbox Code Playgroud)
$运算符使用的部分匹配将返回一个值,如果它可以唯一地标识给定词干(例如 - mail)的变量.
例如 - mail你的任何其他东西都没有data.frame,所以你得到了mail_a回报.
u["mail"] 会抛出一个错误.
再举一个例子,说明它的工作原理,你会想到:
test <- data.frame(aa=1:10,aaa=letters[1:10])
> test$aa
[1] 1 2 3 4 5 6 7 8 9 10
> test$aaa
[1] a b c d e f g h i j
Levels: a b c d e f g h i j
> test$a
NULL
Run Code Online (Sandbox Code Playgroud)
而fortune(312)这@mnel指的是:
"这里的问题是,$符号是一个神奇的捷径,就像任何其他魔法一样,如果使用不当可能会使程序化等同于将自己变成蟾蜍."
- Greg Snow(响应想要访问名称通过x $ y而不是x [[y]]存储在y中的列的用户)R-help(2012年2月)
u$mail
Run Code Online (Sandbox Code Playgroud)
正在呼唤相当于
u[['mail', exact = FALSE]]
Run Code Online (Sandbox Code Playgroud)
它将使用部分匹配来查找命名元素(列)
u[['mail']]
Run Code Online (Sandbox Code Playgroud)
不会使用部分匹配,因此不会找到任何列.
[[ 如财富(312)所述,使用更安全
/\_/\
( o o )
== Y ==
- -
Run Code Online (Sandbox Code Playgroud)