实在是被这个东西给烦死了,我现在每次取matrix的行列都要强迫症似的补上drop=FALSE,只要一时忘了加回头换一个低维的数据跑就准要报错。感觉“[”这个方法用在矩阵上时基本就用不到需要drop=TRUE时候。这点跟“[.data.frame"不一样,取data.frame的行列的时候大多数都是为了提取一个观测值或者是提取一个变量,自动降维很自然。但是如果是特意要对matrix取行列,基本上都是核心算法里用来进行矩阵运算的,维数一点也不能乱,这个时候再自动降维就非常令人烦躁了。这个设定真是毫无道理,我琢磨着八成又是一个从S那里传承下来的古老传统。
抱怨归抱怨,更现实的问题是除了每次都手动写一遍drop=FALSE之外还有没有其他对策。因为"["这货是个原生函数,所以直接用formals修改默认参数值完全没用。然后考虑自己写一个函数包装一下,不过我现在只会写成这样的形式:
p=function(m,...)
m[..1,..2,drop=FALSE]
不过这样用起来还是不够方便。其实最好是能够自己重新指定一组新的括号运算符,可以实现同样的效果。然而问题是完全不知道该怎么自己写新的括号运算符。看了一下[.data.frame的源代码,也没看明白到底是怎么一个原理,尤其是后半括号]是怎么和前半括号[匹配上的?
其实最希望的还是官方能出一种解决方案。像当初paste0一样的办法估计是没戏了,因为这东西是个括号运算符,总不能再出一个"[0"出来吧。大概官方可以把drop=FALSE作为一个可选选项放到options里头,默认drop=TRUE以便与旧代码兼容,然后需要默认drop=FALSE的就自己去打开……