在 R 包中创建 S3 class
Creating S3 class in an R Package
我编写的代码非常简单地为包创建了一个 S3 class。我试图创建一个新的 S3 class 以便我可以开发,例如,自定义 print()
方法。
我已经在一个简单的 R 脚本中测试了代码,但是一旦函数被包装到一个包中,功能就会中断并且不再创建 S3 class。我无法提供创建包的可重现代码,但下面介绍了我想构建到包中的功能的简化版本。
无论是原始代码还是在函数内编写,我的代码都能完美运行。
x <- 1:10
class(x)
class(x) <- append(class(x),"newS3class")
class(x)
将 return c("integer", "newS3class")
同样,现在,声明一个函数来做同样的事情。这也很好用。实际上,我的函数 foo()
首先对输入执行一些操作,然后 return 使用新的 class.
输出输出
foo <- function(y) {
y <- y + 3
class(y) <- append(class(y), "newS3class")
y
}
class(1:5)
returns "integer"
。 class(foo(1:5))
returns c("integer", "newS3class")
。这符合预期。
但是,当我开发一个包时,例如 mypkg
,然后 运行 mypkg::foo()
,功能被破坏了。即 (mypkg::foo(1:5))
returns "integer" 而不是 c("integer", "newS3class")
.
在从其构成函数构建包的过程中,是否发生了关于范围界定的事情,阻止了它的工作?
我在这里犯的错误是我没有正确导出class。为了解决这个问题,我在使用 roxygen 包构建我的文档和 NAMESPACE 之前添加了以下代码块,包括导出行。
#' @export summary.objectclass
makeobjectclass <- function(x) {
class(x) <- c("objectclass", class(x))
x
}
我编写的代码非常简单地为包创建了一个 S3 class。我试图创建一个新的 S3 class 以便我可以开发,例如,自定义 print()
方法。
我已经在一个简单的 R 脚本中测试了代码,但是一旦函数被包装到一个包中,功能就会中断并且不再创建 S3 class。我无法提供创建包的可重现代码,但下面介绍了我想构建到包中的功能的简化版本。
无论是原始代码还是在函数内编写,我的代码都能完美运行。
x <- 1:10
class(x)
class(x) <- append(class(x),"newS3class")
class(x)
将 return c("integer", "newS3class")
同样,现在,声明一个函数来做同样的事情。这也很好用。实际上,我的函数 foo()
首先对输入执行一些操作,然后 return 使用新的 class.
foo <- function(y) {
y <- y + 3
class(y) <- append(class(y), "newS3class")
y
}
class(1:5)
returns "integer"
。 class(foo(1:5))
returns c("integer", "newS3class")
。这符合预期。
但是,当我开发一个包时,例如 mypkg
,然后 运行 mypkg::foo()
,功能被破坏了。即 (mypkg::foo(1:5))
returns "integer" 而不是 c("integer", "newS3class")
.
在从其构成函数构建包的过程中,是否发生了关于范围界定的事情,阻止了它的工作?
我在这里犯的错误是我没有正确导出class。为了解决这个问题,我在使用 roxygen 包构建我的文档和 NAMESPACE 之前添加了以下代码块,包括导出行。
#' @export summary.objectclass
makeobjectclass <- function(x) {
class(x) <- c("objectclass", class(x))
x
}