我在包装中包含以下方法部分(代码本身并不重要):
#' Improved vector subsetting
#'
#' @param x a composer_vector
#' @param i standard indices used to subset
#' @param ... predicate subsetting functions applied on top off subset by indices
#' @export
#' @examples
#' vec <- co("A hello", "B hi")
#' vec[,~startsWith(.,"A")]
#' vec[1:2, ~startsWith(.,"A")]
#' vec[startsWith ="A"]
`[.composer_vector` <- function(x, i, ...) {
x <- unco(x)
if (!missing(i)) x <- x[i]
fs <- list(...)
if (length(fs)) {
fs <- harmonize_funs(fs,NULL)
x <- x[purrr::reduce(fs,~.y(x) & .x, .init = TRUE)]
}
co(x)
}
我可以使用以下方法来文档化,构建和安装软件包,
devtools::document()
pkg_path <- devtools::build()
install.packages(pkg_path, repos = NULL, type="source",clean=TRUE)
但是当我附加包时,该方法不会导出(无法通过::
访问,尽管可以通过:::
访问),并且在适当类的对象上使用该方法时也不会调用该方法
如果我将其重命名为foo
,一切都会顺利进行,并且foo
将被导出。
为[[
定义方法时,我遇到相同的问题。
如果它对data.table
有效,为什么对我不起作用?
完整的软件包代码在github上,尤其是在brackets.R
中答案 0 :(得分:2)
这是因为该函数未导出到您的NAMESPACE
文件中。 @export
标签只会在您运行NAMESPACE
时不存在devtools::document()
文件的情况下为您提供帮助。如果您在NAMESPACE
时已经拥有document()
文件,则会收到警告
警告:roxygen2没有生成现有的“ NAMESPACE”文件, 并且不会被覆盖。
您的NAMESPACE
拥有
exportPattern("^[[:alpha:]]+")
这通常很好,因为通常您只有要以字母开头的函数(要导出的函数)。但是,在这里要导出以[
开头的函数,而这不会这样做。因此,如果您删除NAMESPACE
文件并重新运行devtools::document("composer/")
,然后重新安装该软件包,则将编写一个新的NAMESPACE
来正确导出所有功能,包括提取方法:>
# Generated by roxygen2: do not edit by hand
S3method("[",composer_vector)
S3method("[[",composer_vector)
export(..)
export(co)
export(compose2)
export(unco)
那么下面的方法就可以了:
library(composer)
vec <- co("A hello", "B hi")
vec[,~startsWith(.,"A")]
# [1] "A hello"
# attr(,"class")
# [1] "composer_vector" "character"
vec[startsWith ="A"]
# [1] "A hello"
# attr(,"class")
# [1] "composer_vector" "character"