R中$符号自动匹配列名疑问:输入MRE$app为何能获取apples列?
R数据框$操作符的部分匹配行为解析
这不是什么新特性,是R里$操作符的默认行为——部分匹配,已经存在很多年了。
实现原理
当你用$访问数据框的列时,R会先检查输入的名称是否完全匹配某一列。如果找不到完全匹配的,它会尝试匹配以输入字符串为前缀的列名:
- 如果有且仅有一列的名称以输入的前缀开头,R就会自动返回该列的数据,比如你例子里的
app匹配到apples; - 如果有多个列符合前缀匹配(比如同时有
apples和applesauce),$会返回NULL,因为无法确定要选哪一列。
如何禁用部分匹配
如果你想让$严格匹配完整列名,避免这种“自动补全”式的匹配,可以设置全局选项:
options(warnPartialMatchDollar = TRUE)
之后再用部分匹配时,R会抛出警告提示你。
另外,如果你需要完全严格的匹配,推荐使用[[操作符,它不支持部分匹配,必须输入完整列名:
MRE[["app"]] # 返回NULL,符合你原本的预期 MRE[["apples"]] # 正常返回目标列
内容的提问来源于stack exchange,提问作者RobH
相关产品推荐
相关产品推荐

