但是,我找不到在该包中的其他函数中实际调用的几个函数!
如果我用任何其他名称定义一个已经定义的函数,该函数将不起作用。例如,假设包中有一个函数
oldfunction <- function (nn){m <- nn}
我复制了oldfunction
的整个源代码,并将其定义为
myfunction <- function (nn){m <- nn}
。这里
oldfunction
有效,但是
myfunction
给了我一个错误。我可以看到作者的github链接中有代码文件说他们已经使用了
Rcpp Exports
。问题是我在这里完全是门外汉。
Rcpp Exports
是否使用
C++
中定义的函数,而作者在其 github Rcode 文件中可能未提供这些函数?我真的很感激这方面的任何建议。
internal_fun
获取它们。你需要做
package:::internal_fun
。例如,考虑
contrasts()
包(默认加载的基础包)的
stats
,里面有一个
.Diag()
函数。
> contrasts
function (x, contrasts = TRUE, sparse = FALSE)
{
[...]
if (!contrasts)
return(.Diag(levels(x), sparse = sparse))
[...]
}
<bytecode: 0x573380b6c578>
<environment: namespace:stats>
即使加载了 stats
命名空间,
> any(grepl('stats', loadedNamespaces()))
[1] TRUE
.Diag
找不到。
> .Diag
Error: object '.Diag' not found
使用 `:::`
会起作用:
> stats:::.Diag
function (nms, sparse)
{
n <- as.integer(length(nms))
d <- c(n, n)
dn <- list(nms, nms)
if (sparse) {
if (!suppressPackageStartupMessages(requireNamespace("Matrix")))
stop(gettextf("%s needs package 'Matrix' correctly installed",
"contr*(.., sparse=TRUE)"), domain = NA)
methods::new("ddiMatrix", diag = "U", Dim = d, Dimnames = dn)
}
else array(c(rep.int(c(1, numeric(n)), n - 1L), 1), d, dn)
}
<bytecode: 0x57337f73d3b0>
<environment: namespace:stats>
结论
在复制的源代码中,将internal_fun
替换为
package:::internal_fun
以使其正常工作。为了避免安装相应的包,您还可以复制
package:::internal_fun
的源代码(有时这可能是一个深度嵌套的工作)。