R использует s3 и s4 методы simulate в одном пакете

Я озадачен ошибкой

found an S4 version of 'simulate' so it has not been imported correctly 

Я написал пакет R, который включает определение метода simulate() как метода S3. Поскольку дженерик для simulate уже определен, я просто определяю simulate.myclass (simulate.fitContinuous в моем случае).

Пакет также зависит от другого пакета, который имеет S4 версию simulate. При загрузке моего пакета я получаю вышеуказанную ошибку версии S4. Я не уверен, что вызывает ошибку.

Воспроизвести пример можно, взяв пакет с github, или сделать

require(devtools) 
install_github("pmc", "cboettig")
require(pmc)

Чтобы воспроизвести эту ошибку с нуля: Создайте новый пакет с минимальным файлом DESCRIPTION. включите в DESCRIPTION импорт: ouch. Создайте NAMESPACE и добавьте imports(ouch) и S3method(simulate, test). Создайте каталог R, добавьте тривиальный скрипт R (я включил документацию по roxygen, который создаст NAMESPACE, о котором я только что говорил, но эта ошибка может быть создана и без devtools/roxygen):

#' simulate
#' 
#' a test for s3/s4 conflicts
#' @param object who cares?
#' @param nsim guess.
#' @param seed yup
#' @param ... other parameters we will just ignore
#' @return something
#' @method simulate test
#' @S3method simulate test
#' @import ouch
simulate.test <- function(object, nsim = 1, seed = NULL, ...){
  message("This test worked")
}

Установите пакет (если хотите, сначала документируйте с помощью devtools), и вы получите ошибку.

Мое лучшее решение на данный момент - убрать строку S3method из NAMESPACE, а вместо нее экспортировать полную функцию simulate.test. Это пройдет проверку и установится без предупреждений, но это явно неполноценное решение.

Другое решение - иметь ouch в depends и imports, а также правильно документировать метод S3 (как описано выше). Тогда все работает как ожидалось, но предупреждение остается.

5
задан cboettig 19 January 2012 в 05:30
поделиться