在包中为 `[` 和 `[[` 定义方法时出现问题
Issues when defining methods for `[` and `[[` in a package
我有以下方法包的一部分(代码本身并不重要):
#' 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)
但是当我附加包时,该方法未导出(无法使用 ::
访问,但可以使用 :::
访问),并且当我在合适的class.
如果我将其重命名为 foo
一切顺利并且 foo
被导出。
我在为 [[
定义方法时遇到同样的问题。
如果它适用于 data.table
,为什么它对我不起作用?
完整包代码在github and this code in particular is located in brackets.R
这是因为您的 NAMESPACE
文件中没有导出函数。 @export
标签只会在 运行 devtools::document()
时不存在的情况下帮助您处理 NAMESPACE
文件;如果您在 document()
时已有 NAMESPACE
文件,您将收到警告
Warning: The existing 'NAMESPACE' file was not generated by roxygen2,
and will not be overwritten.
你的 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"
我有以下方法包的一部分(代码本身并不重要):
#' 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)
但是当我附加包时,该方法未导出(无法使用 ::
访问,但可以使用 :::
访问),并且当我在合适的class.
如果我将其重命名为 foo
一切顺利并且 foo
被导出。
我在为 [[
定义方法时遇到同样的问题。
如果它适用于 data.table
,为什么它对我不起作用?
完整包代码在github and this code in particular is located in brackets.R
这是因为您的 NAMESPACE
文件中没有导出函数。 @export
标签只会在 运行 devtools::document()
时不存在的情况下帮助您处理 NAMESPACE
文件;如果您在 document()
时已有 NAMESPACE
文件,您将收到警告
Warning: The existing 'NAMESPACE' file was not generated by roxygen2, and will not be overwritten.
你的 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"