2016-07-18 61 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」工作。野外有很多例子。我鏈接到一個。 –