为啥 `data.table::unique` 不起作用?
Posted
技术标签:
【中文标题】为啥 `data.table::unique` 不起作用?【英文标题】:Why `data.table::unique` doesn't work?为什么 `data.table::unique` 不起作用? 【发布时间】:2015-06-05 01:09:25 【问题描述】:help(unique)
表明 unique
函数存在于两个包中 - base
和 data.table
。我想使用data.table
包中的这个功能。我认为以下语法 - data <- data.table::unique(data)
表示要使用的包。但我收到以下错误 -
'unique' 不是从 'namespace:data.table' 导出的对象
但是data <- unique(data)
效果很好。
这里有什么问题?
【问题讨论】:
data.table:::unique.data.table(data)
没有导出也没有unique
,只有unique.data.table
【参考方案1】:
在 R 中实际上有两个中缀运算符,它们从特定的包命名空间中提取函数。您使用了::
,但还有一个:::
可以检索“未导出”函数。 unique
-function 实际上是一系列函数,它的行为将取决于其参数的类和已加载的特定包。 R 术语是“通用的”。试试:
data <- data.table:::unique(data) # assuming 'data' is a data.table
另一个可以让您窥视“导出”不足所造成的幕后情况的工具是getAnywhere
-函数。它可以让你在控制台看到代码:
> unique.data.table
Error: object 'unique.data.table' not found
> getAnywhere(unique.data.table)
A single object matching ‘unique.data.table’ was found
It was found in the following places
registered S3 method for unique from namespace data.table
namespace:data.table
with value
function (x, incomparables = FALSE, fromLast = FALSE, by = key(x),
...)
if (!cedta())
return(NextMethod("unique"))
dups <- duplicated.data.table(x, incomparables, fromLast,
by, ...)
.Call(CsubsetDT, x, which_(dups, FALSE), seq_len(ncol(x)))
<bytecode: 0x2ff645950>
<environment: namespace:data.table>
【讨论】:
【参考方案2】:有问题的函数实际上是unique.data.table
,data.table
包中定义的 S3 方法。该方法并不真正打算直接调用,因此不会导出。这通常是 S3 方法的情况。相反,包将该方法注册为 S3 方法,然后允许 S3 泛型 base::unique
在本例中调度它。所以调用函数的正确方式是:
library(data.table)
irisDT <- data.table(iris)
unique(irisDT)
我们使用导出的base::unique
,并调度未导出的data.table:::unique.data.table
。 data.table:::unique
函数实际上并不存在(或者它需要存在)。
正如 eddi 指出的那样,base::unique
基于被调用对象的类进行调度。所以base::unique
只会在对象是data.table
时调用data.table:::unique.data.table
。您可以使用data.table:::unique.data.table(iris)
之类的内容直接强制调用该方法,但在内部这很可能会导致调用下一个方法,除非您的对象实际上是data.table
。
【讨论】:
谢谢。我是否正确理解您的答案 - 如果传递给unique
的参数是data.frame
,则使用来自base
包的unique
;如果 data.table
被传递 - 那么来自 data.table
?
@LA_ 是(将使用unique.data.frame
),并查看unique
的源代码(只需输入unique
)然后阅读?UseMethod
了解这仅适用于“S3 方法”很重要。 (R 是一种不断发展的语言。)S4 和以后的类需要不同的过程。以上是关于为啥 `data.table::unique` 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章