【问题标题】:Creating S3 class in an R Package在 R 包中创建 S3 类
【发布时间】:2017-10-27 17:41:04
【问题描述】:

我编写的代码非常简单地为一个包创建了一个 S3 类。我寻求创建一个新的 S3 类,以便我可以开发,例如,自定义 print() 方法。

我已经在一个简单的 R 脚本中测试了代码,但是一旦将函数包装到一个包中,功能就会中断并且不再创建 S3 类。我无法提供用于创建包的可重现代码,但下面介绍了我想构建到包中的功能的简化版本。

我的代码无论是在原始代码还是在函数中编写时都能完美运行。

    x <- 1:10
    class(x)
    class(x) <- append(class(x),"newS3class")

class(x) 将返回 c("integer", "newS3class")

同样,现在,声明一个做同样事情的函数。这也很好用。实际上,我的函数foo() 首先对输入执行一些操作,然后使用新类返回输出。

    foo <- function(y) {
      y <- y + 3
      class(y) <- append(class(y), "newS3class")
      y
    }

class(1:5) 返回"integer"class(foo(1:5)) 返回 c("integer", "newS3class")。这符合预期。

但是,当我开发一个包时,例如mypkg,然后运行mypkg::foo(),功能就被破坏了。即,(mypkg::foo(1:5)) 返回“整数”而不是 c("integer", "newS3class")

在从其组成功能构建包的过程中,范围界定是否发生了某些事情,从而阻止了它的工作?

【问题讨论】:

  • github上有包吗
  • 我没有;也许这个周末

标签: r r-package r-s3


【解决方案1】:

我在这里犯的错误是我没有正确导出类。为了解决这个问题,我在使用 roxygen 包构建文档和命名空间之前添加了以下代码块,包括导出行。

#' @export summary.objectclass
makeobjectclass <- function(x) {
    class(x) <- c("objectclass", class(x))
    x
}

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2021-10-14
    • 1970-01-01
    • 2014-04-27
    • 2011-02-27
    相关资源
    最近更新 更多