为啥 `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 函数存在于两个包中 - basedata.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.tabledata.table 包中定义的 S3 方法。该方法并不真正打算直接调用,因此不会导出。这通常是 S3 方法的情况。相反,包将该方法注册为 S3 方法,然后允许 S3 泛型 base::unique 在本例中调度它。所以调用函数的正确方式是:

library(data.table)
irisDT <- data.table(iris)
unique(irisDT)

我们使用导出的base::unique,并调度未导出的data.table:::unique.data.tabledata.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` 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥需要softmax函数?为啥不简单归一化?

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

gprof 适合分析长时间运行的程序吗?为啥或者为啥不?

为啥每次都加载新的 xib 文件?为啥不替换前一个?

在执行语义分割任务时我应该减去图像均值吗?为啥或者为啥不?

为啥 int 存在于 C 中,为啥不只是 short 和 long