Github R 包和 Rcpp 导出

问题描述 投票:0回答:1
我正在尝试理解来自 Github 的包(该包在 R cran 中不可用)。

但是,我找不到在该包中的其他函数中实际调用的几个函数!

如果我用任何其他名称定义一个已经定义的函数,该函数将不起作用。例如,假设包中有一个函数

oldfunction <- function (nn){m <- nn}
我复制了

oldfunction

的整个源代码,并将其定义为
myfunction <- function (nn){m <- nn}
。这里 
oldfunction
 有效,但是 
myfunction
 给了我一个错误。

我可以看到作者的github链接中有代码文件说他们已经使用了

Rcpp Exports

。问题是我在这里完全是门外汉。

Rcpp Exports

是否使用
C++
中定义的函数,而作者在其 github Rcode 文件中可能未提供这些函数?

我真的很感激这方面的任何建议。

r function github package rcpp
1个回答
0
投票
包通常使用未导出的内部函数,即您无法使用

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
 的源代码(有时这可能是一个深度嵌套的工作)。

© www.soinside.com 2019 - 2024. All rights reserved.