我正在了解CJ()
包中的data.table
函数,我想了解它是如何工作的。为此,我通常从没有括号的CJ
输入源代码,将其存储在我自己的副本中并更改/删除/添加行以帮助我完成它。
但是来自CJ
的源代码似乎并不是自包含的#34;当我这样做时,它无法找到函数take()
和forder()
。
这就是我的意思:
library(data.table)
## data.table 1.9.2 For help type: help("data.table")
CJ(letters,1:100) # cross-join from data.table, works.
我知道我可以写一个别名:
cjs_alias <- CJ # alias to fxn
cj_alias(letters,1:100) # works.
然后如果我输入:
CJ
并从控制台复制输出并将其粘贴到我的文档中,作为我自己的副本的定义,以便使用:
cjs_copy <- function (..., sorted = TRUE)
{
l = list(...)
j = lapply(l, class)
if (length(l) == 1L && sorted && length(o <- forder(l[[1L]])))
l[[1L]] = l[[1L]][o]
else if (length(l) > 1L) {
n = vapply(l, length, 0L)
nrow = prod(n)
x = c(rev(take(cumprod(rev(n)))), 1L)
for (i in seq_along(x)) {
y = l[[i]]
if (sorted && length(o <- forder(y)))
y = y[o]
if (i == 1L)
l[[i]] = rep.int(y, times = rep.int(x[i], n[i]))
else if (i == length(n))
l[[i]] = rep.int(y, times = nrow/(x[i] * n[i]))
else l[[i]] = rep.int(rep.int(y, times = rep.int(x[i],
n[i])), times = nrow/(x[i] * n[i]))
if (any(class(l[[i]]) != j[[i]]))
setattr(l[[i]], "class", j[[i]])
}
}
setattr(l, "row.names", .set_row_names(length(l[[1L]])))
setattr(l, "class", c("data.table", "data.frame"))
if (is.null(vnames <- names(l)))
vnames = vector("character", length(l))
if (any(tt <- vnames == "")) {
vnames[tt] = paste("V", which(tt), sep = "")
setattr(l, "names", vnames)
}
l <- alloc.col(l)
if (sorted)
setattr(l, "sorted", names(l))
l
}
# <bytecode: 0x7f954a57c188>
# <environment: namespace:data.table>
它会产生cjs_copy
功能但是当我尝试时:
cjs_copy(letters,1:100)
我明白了:
## Error in rev(take(cumprod(rev(n)))) : could not find function "take"
为什么这不起作用?和有人可以解释我如何访问这些非导出的功能吗?
非常感谢。