如何访问包中的非导出函数:来自data.table的`CJ`

时间:2014-05-27 16:30:47

标签: r data.table

我正在了解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" 

为什么这不起作用?有人可以解释我如何访问这些非导出的功能吗?

非常感谢。

0 个答案:

没有答案