代码之家  ›  专栏  ›  技术社区  ›  moodymudskipper

为包中的`[`和`[[`定义方法时出现的问题

  •  3
  • moodymudskipper  · 技术社区  · 7 年前

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

    #' 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 一切顺利 已导出。

    我在定义 [[ .

    data.table 为什么不适合我?


    完整程序包代码已打开 github 这个代码尤其位于 brackets.R

    1 回复  |  直到 7 年前
        1
  •  2
  •   duckmayr    7 年前

    这是因为函数没有在您的 NAMESPACE @export 标签只会帮助你 命名空间 如果运行时文件不存在 devtools::document() ;如果您已经有 当你 document()

    警告:现有的“NAMESPACE”文件不是由roxygen2生成的, 不会被覆盖。

    exportPattern("^[[:alpha:]]+")
    

    这通常是好的,因为通常您只有以字母开头的函数(您希望导出的函数)。但是,这里需要导出以 [ ,这是不行的。所以,如果你删除你的 命名空间 devtools::document("composer/") ,然后重新安装新的 命名空间

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