[英]What is the benefit of import in a namespace in R?
R的命名空間機制允許人們export
隨后對用戶可見的功能。 此外,它允許從其他包import
功能。 雖然出口的好處是顯而易見的,但我在理解進口的好處方面存在更多問題。
似乎有一個好處是,可以使用其他軟件包中的函數而無需附加軟件包,從而節省內存。 這在寫作R擴展手冊的1.6.4節中有所例證。
但是,導入功能必須具有其他好處。 特別是, 第1.6.6節(處理S4類)顯示了stats4包的namespace
:
export(mle)
importFrom("graphics", plot)
importFrom("stats", optim, qchisq)
## For these, we define methods or (AIC, BIC, nobs) an implicit generic:
importFrom("stats", AIC, BIC, coef, confint, logLik, nobs, profile,
update, vcov)
exportClasses(mle, profile.mle, summary.mle)
## All methods for imported generics:
exportMethods(coef, confint, logLik, plot, profile, summary, show, update, vcov)
## implicit generics which do not have any methods here
export(AIC, BIC, nobs)
這里有進口的函數,它們既不S4類也不泛型(它將使意義使用進口以及,如在記錄在例如該部分 ),但功能類似plot
從graphics
R在時,被自動加載包。
因此我的問題是,導入plot
, optim
或qchisq
等函數有什么好處?
如果從包Bar導入函數foo
,則無論用戶對其搜索路徑做什么,都可以找到它,例如,通過附加也具有函數foo
的包Baz。 沒有名稱空間,包代碼會突然發現自己使用Baz::foo
。 還存在效率問題( foo
立即被發現,而不是在搜索路徑上的所有符號之后),但是對於大多數應用來說這些可能是微不足道的。 同樣, importFrom
是對import
的改進,因為更少的沖突(或使用非預期的功能)和更有效的查找。
使用S4(和S3),事情會變得非常復雜。 可以將一個非泛型函數(如graphics::plot
提升為兩個不同包中的泛型(使用setGeneric
),並且每個泛型都可以附加自己的一組方法。 包作者需要准確了解哪個plot
通用,以及哪些方法調度表,他們的類和方法看到。
使用pkg::foo
調用函數始終會解析為預期的函數。 它要求pkg列在DESCRIPTION文件的Depends:字段中(可能在Imports中:但是它似乎誤導了廣告而不是從pkg導入),污染了用戶的搜索路徑。 它還涉及兩個符號查找和一個函數調用( ::
,因此效率較低。 我對懶惰和缺乏關注細節的部分也看到使用::
作為單調乏味且容易出錯。
包codetoolsBioC (通過帶有用戶名和密碼的svn readonly
)可以從現有的包中生成一個NAMESPACE文件(或者至少可以在R-devel的最近更改之前在沒有一個包的情況下在包上引入NAMESPACE;我還沒有在這樣的包上嘗試過codetoolsBioC一袋)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.