NAMESPACE中的S3方法未导出

时间:2017-10-27 01:31:11

标签: r namespaces devtools

我正在使用devtools :: document()开发一个R包来创建NAMESPACE文件。其中一些函数是S3方法,用于汇总,预测,绘图,打印通用在basestats中的位置。 我正在使用@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(这会导致包检查错误)。两者都允许导出方法和函数。

2 个答案:

答案 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