[英]R with roxygen2: How to use a single function from another package?
我正在創建一個R包,它將使用plyr
的單個函數 。 根據這個roxygen2小插圖 :
如果您只使用其他軟件包中的一些函數,建議的選項是在DESCRIPTION文件的Imports:字段中記下軟件包名稱,並使用::顯式調用函數,例如pkg :: fun() 。
聽起來不錯。 我正在使用plyr::ldply()
- 完全調用::
- 所以我在Imports:
列出了plyr
Imports:
在我的DESCRIPTION
文件中。 但是,當我使用devtools::check()
我得到了這個:
* checking dependencies in R code ... NOTE
All declared Imports should be used:
‘plyr’
All declared Imports should be used.
為什么我會收到這個說明?
我可以通過在使用plyr
的文件中添加@importFrom dplyr ldply
來避免該注釋,但隨后我結束但在我的包命名空間中有ldply
。 我不想要,也不應該因為我使用plyr::ldply()
我一次使用該函數。
任何指針將不勝感激!
( 這個問題可能有用。)
如果ldply()
對於包的功能很重要 ,那么您確實需要它在包命名空間中。 這就是名稱空間導入的重點。 您需要的函數應該在包命名空間中,因為這是R首先查找函數定義的地方,然后遍歷基本命名空間和附加的包。 這意味着無論其他軟件包是加載還是卸載,附加或未附加,您的軟件包始終都可以訪問該函數。 在這種情況下,使用:
@importFrom plyr ldply
你可以在沒有plyr::
前綴的情況下引用ldply()
,就好像它是你的包中的另一個函數一樣。
如果ldply()
不是那么重要 - 也許它只在一個不常用的函數中被調用一次 - 那么, Writing R Extensions 1.5.1給出了以下建議:
如果一個包只需要來自另一個包的幾個對象,它可以在代碼中使用完全限定的變量引用而不是正式的導入。 包
foo
函數f
完全限定引用的形式為foo::f
。 這比正式導入效率略低,並且還失去了在NAMESPACE
文件中記錄所有依賴項的優勢(但它們仍然需要記錄在DESCRIPTION
文件中)。 評估foo::f
將導致加載包foo
,但如果沒有加載則不會附加 - 這可以延遲加載很少使用的包。
(我認為這個建議實際上有點過時了,因為它暗示了DESCRIPTION
和NAMESPACE
之間比現在存在更多的分離。)這意味着你應該使用@import plyr
並將該函數稱為plyr::ldply()
。 但在現實中,它實際上是表明像把plyr
在Suggests
的現場DESCRIPTION
,這是不完全由roxygen2標記,也不符合正好符合容納R CMD check
。
總之 ,官方的說法是Hadley的建議(你引用的)僅適用於極少使用的函數(很少使用的函數包)(和/或需要花費大量時間加載的軟件包)。 否則,就像WRE建議的@importFrom
一樣:
有選擇地使用
importFrom
而不是import
是一種很好的做法,特別推薦從具有十幾個導出的包中導入時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.