R统计笔记(四):中括号与双中括号的差异

理解的差异首先从语言方面开始,如果你有其他语言的惯性思维,比如JAVA、C或者Javascript,那对R语言中括号的理解,简直就是匪夷所思。

1. 所有的对象都可以引用中括号

是的,你没有看错,R语言中所有对象都可以引用中括号,包括标量(常量),如下:

#   标量第一个元素总是指向自己
#   下面的表达式恒为真
1[1] == 1
#   既然上面的等式成立,那么下面的等式也成立
1[1][1] == 1
1[1][1] == 1[1]

按照面向对象的思想,1[1][1] == 1[1]很好理解,那怎么理解[[1]]呢?是对[]的分解吗?

2. [[]]其实是一种方法

经过反复测试与查阅资料,[[]]要结合起来理解,它就代表一个方法,或者是一个原子的操作符,证明如下:

#   获取操作符[[的帮助
?`[[`

得到的帮助内容如下:

Both [[ and $ select a single element of the list. The main difference is that $ does not allow computed indices, whereas [[ does. x$name is equivalent to x[["name", exact = FALSE]]. Also, the partial matching behavior of [[ can be controlled using the exact argument. 

getElement(x, name) is a version of x[[name, exact = TRUE]] which for formally classed (S4) objects returns slot(x, name), hence providing access to even more general list-like objects. 

简单翻译以下, [[]]与$类似,都是list选取单个元素,唯一的区别是[[通过参数“exact”激活模糊匹配,如下:

#   定义list对象
li <- list(name='yiifaa', age=35)
#   从list提取元素一定要用[[]]
#   模糊匹配到name
li[['nam', exact=FALSE]]

很神奇吧,[[]]竟然还支持模糊匹配。
结合第一条规则,我们还可以得出如下结论:

#   如果R语言支持对象比较的话,那么li[1] == li
li[1][[1]] == li[[1]]
#   继续玩转它们
li[[1]][1] == li[[1]]

好了,看了这么多例子,那么如下的表达式该如何理解:

li[[[1]]]

当然是错误了,因为没有“[[[”这样的操作函数(符)。

结论

在R语言中,[]与[[]]都是操作函数,只是适用范围不一样,[[]]主要用于获取列表(list)中的元素,而[]则可以适用于所有对象,但不能按索引抓取列表(list)中元素。

  • 13
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值