r语言 - 在包中定义"["和"[["方法时出现的问题



我有以下方法包的一部分(代码本身并不重要(:

#' 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上,特别是这个代码位于括号中。R

这是因为该函数未导出到NAMESPACE文件中。@export标签只有在您运行devtools::document()时不存在时才会帮助您处理NAMESPACE文件;如果您在document()时已有NAMESPACE文件,则会收到警告

警告:现有的"命名空间"文件不是由 roxygen2 生成的, 并且不会被覆盖。

您的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"      

最新更新