为什么`data.table :: unique`不起作用?

时间:2015-03-31 15:53:35

标签: r package data.table

help(unique)表明unique功能存在于两个包中 - basedata.table。我想在data.table包中使用此功能。我认为以下语法 - data <- data.table::unique(data)表示要使用的包。但是我收到以下错误 -

  

'unique'不是'namespace:data.table'

中的导出对象

data <- unique(data)效果很好。

这里有什么问题?

2 个答案:

答案 0 :(得分:6)

有问题的函数实际上是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:::unique.data.table时才会调用data.table。您可以使用类似data.table:::unique.data.table(iris)的内容直接强制调用该方法,但在内部调用很可能会导致调用下一个方法,除非您的对象实际上是data.table

答案 1 :(得分:5)

R中实际上有两个中缀运算符从特定的包名称空间中提取函数。您使用了::,但还有一个:::可以检索“未导出”的功能。 unique - 函数实际上是一系列函数,其行为将取决于其参数的类和已加载的特定包。 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>