簡體   English   中英

R with roxygen2:如何使用另一個包中的單個函數?

[英]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 ,但如果沒有加載則不會附加 - 這可以延遲加載很少使用的包。

(我認為這個建議實際上有點過時了,因為它暗示了DESCRIPTIONNAMESPACE之間比現在存在更多的分離。)這意味着你應該使用@import plyr並將該函數稱為plyr::ldply() 但在現實中,它實際上是表明像把plyrSuggests的現場DESCRIPTION ,這是不完全由roxygen2標記,也不符合正好符合容納R CMD check

總之 ,官方的說法是Hadley的建議(你引用的)僅適用於極少使用的函數(很少使用的函數包)(和/或需要花費大量時間加載的軟件包)。 否則,就像WRE建議的@importFrom一樣:

有選擇地使用importFrom而不是import是一種很好的做法,特別推薦從具有十幾個導出的包中導入時。

暫無
暫無

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

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