LA_*_*LA_ 2 r package data.table
help(unique)表明unique函数存在于两个包中 - base和data.table.我想从data.table包中使用这个功能.我认为以下语法 - data <- data.table::unique(data)表示要使用的包.但是我收到以下错误 -
'unique'不是'namespace:data.table'中的导出对象
但data <- unique(data)效果很好.
这有什么不对?
有问题的功能实际上unique.data.table是data.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
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)
| 归档时间: |
|
| 查看次数: |
963 次 |
| 最近记录: |