簡體   English   中英

即將到來的NAMESPACE,取決於2.14.0的進口變化(一些定義/請使用)

[英]Upcoming NAMESPACE, Depends, Imports changes for 2.14.0 (some definitions/use please)

如果您是軟件包作者,那么當我們在大約一周內轉移到2.14時,您很清楚包裝結構即將發生的變化。 其中一個變化是所有包都需要一個NAMESPACE,如果您沒有生成一個包,將為您生成一個(R等同於您在美國的Miranda權利)。 因此,作為一個好公民,我試圖解決這個問題。 以下是R-exts的部分:

1.6.5摘要 - 轉換現有包

總而言之,將現有包轉換為使用命名空間涉及幾個簡單的步驟:

確定公共定義並將它們放在導出指令中。 識別S3樣式的方法定義並編寫相應的S3method聲明。 識別依賴項並通過import指令替換任何require調用(並在DESCRIPTION文件的Depends和Imports字段中進行適當的更改)。 用.onLoad函數或useDynLib指令替換.First.lib函數。

為了確保我在這里做正確的事,有人可以給出一個簡短明確的定義/答案(我是否通過將幾個小但相關的問題放在一起來打破規則?)。 所有答案都應考慮到2.14,請:

  1. R使用的NAMESPACE的定義
  2. 有沒有辦法在構建和檢查之前生成NAMESPACE,或者我們b / c一次然后編輯自動創建的NAMESPACE?
  3. DESCRIPTION文件中“Depends:”和“Imports:”之間的區別。 特別是,為什么我會把一個包裝在“取決於:”而不是“進口:”,反之亦然?
  4. 聽起來似乎不再使用“要求”了,盡管它並沒有這么說。 這是正確的解釋嗎?

謝謝!

我在https://github.com/hadley/devtools/wiki/Namespaces上寫了一些關於這個主題的文章。

回答你的問題:

  1. 見德克的回答。
  2. 使用roxygen2
  3. 現在每個包都有一個命名空間,沒有理由使用Depends。
  4. require應僅用於加載建議的包

CRAN包已經有NAMESPACEs,因為它幾乎是不朽的。 只需選擇一些您最喜歡的CRAN包並查看他們的NAMESPACE文件。

它可以像從雪中采取的這種單線(加評論)一樣簡單:

# Export all names unless they start with a dot
exportPattern("^[^.]")

像往常一樣運行R CMD check ,在大多數情況下你應該沒問題。

我將在將幾個軟件包切換到R 2.14之后,通過一些細節回答我自己的問題。

上面的描述從手冊中給出的印象是,無論你有什么取決於:對於R 2.13應該轉移到Imports:在R 2.14中。 你應該這樣做,但它們在功能上不是一對一的,我希望從下面的注釋中可以清楚地看到它們。

開始了:

取決於:應該只用於版本限制,例如'R> = 2.10'或'MASS> 0.1',R 2.14下沒有別的。

擁有命名空間部分是一種通知用戶可能存在名稱沖突和“替換”的機制 - 換句話說就是覆蓋正在使用的名稱。 NAMESPACE文件必須與items中的Imports:字段匹配。 導入的函數名稱等將在sessionInfo()中的“通過命名空間加載(而不是附加)”下列出。 這些軟件包已安裝但未加載(即沒有庫(某些導入的軟件包))。

命名空間的另一個作用是使函數“內部”可用於您的包。 這樣,我的意思是如果你的包在導入的包中使用了一個函數,它就會被找到。

但是,當您在檢查期間運行.Rd文件中的示例時,您曾經擁有的軟件包取決於:在R 2.13中但現在在Imports中:在R 2.14下不可用。 這是因為檢查環境非常類似於在干凈的環境中獲取腳本(假設您正在使用R -vanilla,因此.Rprofiles等尚未運行)。 除非你在你的例子中放置了一個庫(需要的包)語句,否則即使在R 2.13下它也不能在R 2.14下工作。 因此,舊的示例不一定會運行,即使您的包Imports:所需的包,因為Imports:與Depends不完全相同:(嚴格來說,它們是附加但未加​​載)。

如果有任何錯誤,請糾正我。 非常感謝Hadley Wickham和其他幫助過我的人!

我最近為我的一個軟件包做過這個工作。 這是我的新Depends,Imports和Suggests行

Depends: R (>= 2.15.0)
Imports: nlme, mvtnorm, KFAS (>= 0.9.11), stats, utils, graphics
Suggests: Hmisc, maps, xtable, stringr

stats,utils和graphics是基礎R的一部分,但是用戶可以將它們分離,然后我的包不起作用。 如果您從命令行使用R,您可能會想“為什么有人會分離這些?”。 但是,如果用戶正在使用RStudio,比方說,我可以看到它們通過並“取消”所有包。 奇怪的是,盡管如此,如果他們這樣做,我不希望我的包裹停止工作。 或者他們可能會重新定義繪圖函數(或其他一些函數),然后我的包會失敗。

我的NAMESPACE有以下幾行

import(KFAS)
import(stats)
import(utils)
import(graphics)

我不想通過並跟蹤我使用的統計數據,實用程序和圖形函數,因此我導入了它們的整個命名空間。 對於KFAS,我只需要2個函數,但導出的函數名稱在版本之間發生了變化,因此我導入整個命名空間,然后在我的代碼中測試用戶具有哪個版本。

對於mvtnorm和nlme,我只使用一個函數,所以我只導入它們。 我可以導入整個命名空間,但嘗試只導入我真正使用的。

importFrom(mvtnorm, rmvnorm)
importFrom(nlme, fdHess)

建議包出現的插圖有

require(package)

在他們的行。

對於我的NAMESPACE中導出的功能,我有點不知所措。 CRAN已嚴格禁止在您的包裹代碼中使用:::。 這意味着如果我不導出功能,我限制創意重用。 另一方面,我理解只需要使用穩定的arg列表導出要維護的函數並輸出,否則我們通過更改函數接口來打破彼此的包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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