2016-07-18 21 views
8

.Call似乎相当不成文; ?.Call给出PACKAGE参数的解释:.Call的PACKAGE参数如何工作?

PACKAGE:如果提供,限制为一个字符串.NAME由该参数(加上常规扩展给出的DLL搜索,“所以”,“的.dll” ,...)。

这一论点如下...,因此它的名字不能缩写。

这是为了通过使用这种说法没有其他包可以覆盖其外部符号添加安全软件包,它可以保证,同时也加快了搜索(见“注释”)。

而在注:

如果这些功能之一是要经常使用,不要指定PACKAGE(以限制搜索到一个DLL)或通过.NAME作为本地标志之一对象。搜索符号可能需要很长时间,尤其是在加载许多名称空间时。

对于链接到R中的符号,您可能会看到PACKAGE = "base"。不要在您自己的代码中使用它:这些符号不是API的一部分,可能会在没有警告的情况下进行更改。

PACKAGE = ""用于被接受(但没有记录):现在是错误的。

但没有使用的例子。

目前还不清楚PACKAGE参数是如何工作的。例如,在回答问题this,我想下面应该有工作,但它并不:

.Call(C_BinCount, x, breaks, TRUE, TRUE, PACKAGE = "graphics") 

而是这个作品:

.Call(graphics:::C_BinCount, x, breaks, TRUE, TRUE) 

这仅仅是因为C_BinCount不导出?即,如果hist.default的内部代码已经添加了PACKAGE = "graphics",那么这将工作吗?

这看起来简单,但真的是很难发现这种说法的使用;没有的,我发现根源给予比顺带提(12345)更多...实际工作,将不胜感激这样的例子(即使它只是引用现有包中发现的代码)

(自我遏制的目的,如果你不希望从另一个问题复制粘贴代码,这里有xbreaks):

x = runif(100000000, 2.5, 2.6) 
nB <- 99 
delt <- 3/nB 
fuzz <- 1e-7 * c(-delt, rep.int(delt, nB)) 
breaks <- seq(0, 3, by = delt) + fuzz 
+0

不错的问题,我只是GOOGLE了它,我发现了一些可以给你一些提示,如果没有人有经验http://www.biostat.jhsph.edu/~bcaffo/statcomp/files/dotCall.pdf – Learner

+1

@学习者确实是我的问题链接3 – MichaelChirico

+1

另请参见[此参考资料](https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Registering-native-routines) –

回答

10

C_BinCount是类“NativeSymbolInfo”的对象,而不是字符串命名一个C级函数,因此PACKAGE(“限制”)搜索字符串.NAME“)不相关。在图形包NAMESPACE中,C_BinCount被制成符号useDynLib()

作为R符号,C_BinCount的分辨率与其他符号的规则相同 - 不从NAMESPACE导出,因此只能通过graphics:::C_BinCount访问。而且,由于这个原因,强大的代码开发也被禁止了。由于C入口点作为符号导入,因此而不是可用作字符串,因此.Call("C_BinCount", ...)将不起作用。

使用NativeSymbolInfo对象告诉R代码位于哪里,因此不需要再通过PACKAGE;使用符号而不是字符串的选择是由程序包开发人员做出的,我认为这通常被认为是很好的做法。在NativeSymbolInfo发明之前开发的许多软件包使用PACKAGE参数,如果我grep的Bioconductor源树有4379行与.Call。*包,如here

其他信息(包括示例)位于Writing R Extensions部分1.5.4中。

+0

谈论深奥的文档...我试过'.Call(“C_BinCount”,x,break,TRUE,TRUE,PACKAGE =“graphics”)',并得到了一个不同的错误(''C_BinCount“'不可用于'.Call ()'为包''图形“')...这是因为它没有被导出?在这里没有办法使用'PACKAGE'参数来执行呼叫吗? – MichaelChirico

+0

另外,你知道任何使用'PACKAGE'参数的_actual_ R代码吗?找到这个“野外”示例很有用 – MichaelChirico

+0

我已经更新了我的答案 - 程序包作者选择不通过字符串暴露符号,因此没有多少键入操作会使“C_BinCount”工作。野外有很多例子。我链接到一个。 –