在包中为`[`和`[[`

时间:2018-09-09 19:19:35

标签: r package brackets

我在包装中包含以下方法部分(代码本身并不重要):

#' 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

1 个答案:

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