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

LA_*_*LA_ 2 r package data.table

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

'unique'不是'namespace:data.table'中的导出对象

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

这有什么不对?

Bro*_*ieG 6

有问题的功能实际上unique.data.tabledata.table包中定义的S3方法.该方法实际上并不是直接调用,因此不会导出.这通常是S3方法的情况.相反,程序包将方法注册为S3方法,然后base::unique在此情况下允许S3泛型在其上进行分派.所以调用函数的正确方法是:

library(data.table)
irisDT <- data.table(iris)
unique(irisDT)
Run Code Online (Sandbox Code Playgroud)

我们使用base::unique,导出,调度data.table:::unique.data.table,不导出.该功能data.table:::unique实际上并不存在(或者它需要).

正如eddi指出的那样,base::unique调度基于被调用对象的类.所以只有当对象是a时base::unique才会调用.您可以直接使用类似的方法强制调用该方法,但在内部调用很可能会导致调用下一个方法,除非您的对象实际上是a .data.table:::unique.data.tabledata.tabledata.table:::unique.data.table(iris)data.table


42-*_*42- 5

R中实际上有两个中缀运算符从特定的包命名空间中提取函数.您使用::但是还有一个:::检索"未导出"的功能.该unique功能全实际上是功能的家庭,其行为将取决于其类的说法,并已加载的特定程序两者.R术语是"通用的".尝试:

data <- data.table:::unique(data)  # assuming 'data' is a data.table
Run Code Online (Sandbox Code Playgroud)

让你偷看缺乏"出口"创造的幕后的另一个工具就是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>
Run Code Online (Sandbox Code Playgroud)