为何R语言中检测fread存在性的两段代码结果不同?
为什么
'fread' %in% data.table()返回FALSE,而存入ls('package:data.table')后返回TRUE? 嘿,作为R初学者碰到这个问题太正常了——核心是你混淆了data.table()函数的作用和包命名空间的查询方式,我给你拆解清楚:
1. 先搞懂data.table()到底做了什么
data.table()是创建一个空的data.table对象的构造函数,而不是用来查看data.table包内容的命令。运行它之后得到的是一个没有任何行和列的空数据表:
data.table() # 输出:Empty data.table (0 rows and 0 cols)
你写的'fread' %in% data.table(),本质是在检查字符串'fread'是不是这个空data.table里的元素(但空表啥都没有),所以自然返回FALSE。
2. ls('package:data.table')才是查询包内容的正确方式
ls()函数如果指定package:前缀的命名空间,就会列出这个包里所有公开的函数、数据集等对象的名称。data.table包的核心函数fread肯定在这个列表里,所以当你把这个列表存入a后,'fread' %in% a就会返回TRUE。
额外小技巧:检查函数是否属于某个包的更直接方法
如果想确认某个函数是否属于指定包,不用绕弯子存列表,直接用exists()指定命名空间:
exists("fread", where = asNamespace("data.table")) # 直接返回TRUE
或者查看函数的所属环境:
environment(fread) # 输出:<environment: namespace:data.table>
内容的提问来源于stack exchange,提问作者vivek
相关产品推荐
相关产品推荐

