簡體   English   中英

在R中的命名空間中導入有什么好處?

[英]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類也不泛型(它將使意義使用進口以及,如在記錄在例如該部分 ),但功能類似plotgraphics R在時,被自動加載包。

因此我的問題是,導入plotoptimqchisq等函數有什么好處?

如果從包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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM