我正在使用devtools :: document()开发一个R
包来创建NAMESPACE文件。其中一些函数是S3方法,用于汇总,预测,绘图,打印通用在base
或stats
中的位置。
我正在使用@export作为Hadley的推荐,并且在NAMESPACE中导致正确的S3方法条目,并且包通过所有检查-as-cran。但是,这些函数不会在NAMESPACE中导出,因此找不到调用print.myclass(我知道这是避免使NAMESPACE混乱的理想行为)。但是,通过Mypackage :: print.myclass调用该函数也会导致该函数不是Mypackage
的导出对象的错误。
问题:这是正确的行为吗?或者是否需要其他步骤才能导出该功能?我试过添加@method print Myclass和@export,但没有运气。在MAC OS X 10.12.6下使用R 3.4.2和devtools
1.13.3
谢谢! Merlise
已编辑:已更新为具有添加/导出方法和导出功能的代码
简单示例 - 使用函数
在RStudio中构建一个框架包#' test for export of S3 methods
#'
#' @title "print hello world for any object"
#' @param x object
#' @param digits optional number specifying the number of digits to display
#' @param ... other parameters to be passed to \code{print.default}
#' @export print.hello
#' @export
print.hello = function (x, digits = max(3, getOption("digits") - 3), ...)
{
cat("\n Hello World \n")
invisible()
}
NAMESPACE现在有
# Generated by roxygen2: do not edit by hand
S3method(print,hello)
export(print.hello)
使用不带参数的@export导出方法,而@export print.hello导出函数,但不会将方法添加到NAMESPACE(这会导致包检查错误)。两者都允许导出方法和函数。
答案 0 :(得分:1)
这是NAMESPACE
文件的正确行为。 ::
访问导出的变量,因此testPackage::print.hello
会失败。
:::
访问内部变量,因此testPackage:::print.hello
应该适合您。
答案 1 :(得分:1)
首先,为了正式定义S3方法并正确导出而不手动更改命名空间文件(假设您使用的是roxygen),
#' test for export of S3 methods
#'
#' @title "print hello world for any object"
#' @param x object
#' @param digits optional number specifying the number of digits to display
#' @param ... other parameters to be passed to \code{print.default}
#'
#' @rdname print
#' @export print
print <- function(x, ...){
UseMethod("print")
}
#' @rdname print
#' @export print.hello
#' @export
print.hello <- function (x, digits = max(3, getOption("digits") - 3), ...)
{
cat("\n Hello World \n")
invisible()
}
这或多或少会为您提供testPackage::print.hello
的预期行为。更重要的是要了解S3方法究竟是什么。它用于R中的方法分派,.
后面的后缀应始终代表您应该作为函数的第一个参数放入的对象类。也就是说,在这种情况下,如果您想通过print.hello
的单个调用使用print
,则必须放置一个hello
类,在成功构建后尝试下面的示例并加载testpackage
a = 1
print(a) # method dispatched as print.default because class of a is numeric
# 1
class(a) <- 'hello'
print(a) # method dispatched as print.hello
# Hello World