2014-07-06 28 views
13

由於roxygen2版本4.0.0@S3method標記已被棄用,以支持使用@export使用roxygen2 v4在名稱中導出非S3方法

該程序包現在會嘗試檢測函數是否爲S3方法,並且如果認爲它是1,則會自動將S3method(function,class)行添加到NAMESPACE文件。

問題是,如果函數不是S3方法,但其名稱包含.,則roxygen有時會出錯並在不應該時添加該行。

有沒有辦法告訴roxygen函數不是S3方法?


根據要求,這裏有一個可重複的例子。

我有一個軟件包,導入R.oo,功能名爲check.arg

library(roxygen2) 
package.skeleton("test") 
cat("Imports: R.oo\n", file = "test/DESCRIPTION", append = TRUE) 
writeLines(
    "#' Check an argument 
#' 
#' Checks an argument. 
#' @param ... Some arguments. 
#' @return A value. 
#' @export 
check.arg <- function(...) 0", 
    "test/R/check.arg.R" 
) 
roxygenise("test") 

現在命名空間包含行S3method(check,arg)

checkR.oo中的S3通用,所以roxygen試圖做個聰明的人,猜測我希望check.arg成爲S3方法。不幸的是,這些功能是不相關的,所以我不這樣做。

(搶佔建議,我只是重新命名check.arg:這是別人寫的遺留代碼,我創建了一個checkArg替代品,但我需要離開check.arg爲兼容性推薦的函數。)

+4

我相信你只是使用'@出口'與函數的全名。包含[可重現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)來測試會很有幫助。 – MrFlick

+0

@MrFlick謝謝你的解決方案,謝謝你提醒我不要懶惰。 –

回答

12

由於Flick先生評論道,將完整的功能名稱附加到roxygen生產線上可以正常工作。如果我行更改爲:

#' @export check.arg 

那麼NAMESPACE文件包含:

export(check.arg) 
+4

另一個需要注意的問題是使用聲明,它會說'## S3 class for class'檢查'\ n檢查(...)',除非你修復它。一種方法是隻添加一個'##'@usage check.arg(x)'指令,不知道是否有更好的方法。 –

+4

**請注意**上述解決方案將在您的'NAMESPACE'文件中爲您提供正確的條目。然而,爲了正確地獲得函數*記錄,你還需要添加一個'@ usage'標記,否則類'arg''的消息'## S3方法將出現在函數簽名的正上方。 Rd'文件和幫助文件中的簽名將是'check(...)'而不是'check.arg(...)'。 – Jthorpe

-1

使用@method generic class@export,而不是@S3method。看看這個線程: S3 method help (roxygen2)

+1

這個問題不是關於如何記錄S3方法;它是關於記錄不是S3方法的東西的相反問題(但是roxygen認爲它們是)。 –

相關問題