Проблемы при определении методов для `[` и `[[` в пакете - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть следующая методическая часть пакета (сам код не важен):

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

1 Ответ

0 голосов
/ 09 сентября 2018

Это потому, что функция не экспортируется в ваш файл NAMESPACE. Тег @export поможет вам только с файлом NAMESPACE, если он не существует при запуске 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"      
...