help(unique)
表明unique
功能存在于两个包中 - base
和data.table
。我想在data.table
包中使用此功能。我认为以下语法 - data <- data.table::unique(data)
表示要使用的包。但是我收到以下错误 -
'unique'不是'namespace:data.table'
中的导出对象
但data <- unique(data)
效果很好。
这里有什么问题?
答案 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>