распространение пакета R, содержащего модульные тесты
-
18-09-2019 - |
Вопрос
поэтому я решил, что помещу свои несколько функций R в пакет, и я читаю / учусь Написание расширения R.
очевидно, что он жалуется на множество вещей, которые я делаю неправильно.
после достаточного количества поисков в Google я задаю здесь несколько вопросов, этот касается стиля тестирования:Я использую РУнит и мне нравится, когда тесты как можно ближе к тестируемому коду.таким образом, я не забуду о тестах и использую их как часть технической документации.
например:
fillInTheBlanks <- function(S) {
## NA in S are replaced with observed values
## accepts a vector possibly holding NA values and returns a vector
## where all observed values are carried forward and the first is
## carried backward. cfr na.locf from zoo library.
L <- !is.na(S)
c(S[L][1], S[L])[1 + cumsum(L)]
}
test.fillInTheBlanks <- function() {
checkEquals(fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4)), c(1, 1, 1, 2, 3, 3, 4))
checkEquals(fillInTheBlanks(c(1, 2, 3, 4)), c(1, 2, 3, 4))
checkEquals(fillInTheBlanks(c(NA, NA, 2, 3, NA, 4)), c(2, 2, 2, 3, 3, 4))
}
но R CMD check
выдает строки примечаний, подобные этой:
test.fillInTheBlanks: no visible global function definition for
‘checkEquals’
и он жалуется на то, что я не документирую тестовые функции.
Я действительно не хочу добавлять документацию для тестовых функций, и я определенно предпочел бы не добавлять зависимость к пакету RUnit.
как, по-вашему, я должен смотреть на этот вопрос?
Решение
Где вы размещаете свои модульные тесты?Возможно, вы не захотите помещать их в R
справочник.Более стандартный подход заключается в том, чтобы поместить их под inst\unitTests
.Взгляните на эта страница R-wiki, касающаяся конфигурации.
В качестве альтернативы вы можете указать, какие файлы будут экспортированы в ваше пространство имен, и, соответственно, какие функции следует документировать, а какие нет.
Кроме того, в идеале ваши тесты должны запускаться при вызове R CMD CHECK;это часть дизайна.В этом случае вам следует создать тестовый скрипт для вызова ваших тестов в отдельном tests
справочник.И вам нужно будет загрузить пакет RUnit в этот скрипт (но вам не нужно делать его зависимостью от вашего пакета).
Правка 1:
Что касается вашего сбоя, потому что он не может найти функцию checkEquals:Я бы изменил вашу функцию, чтобы она была такой:
test.fillInTheBlanks <- function() {
require(RUnit)
checkEquals(fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4)), c(1, 1, 1, 2, 3, 3, 4))
checkEquals(fillInTheBlanks(c(1, 2, 3, 4)), c(1, 2, 3, 4))
checkEquals(fillInTheBlanks(c(NA, NA, 2, 3, NA, 4)), c(2, 2, 2, 3, 3, 4))
}
Таким образом, пакет загружается при вызове функции или он информирует пользователя о том, что пакет необходим.
Правка 2:
Обратите внимание, что все объекты пользовательского уровня в пакете должны быть документированы;если пакет pkg содержит объекты пользовательского уровня, предназначенные только для “внутреннего” использования, он должен предоставить файл pkg-internal.Rd, который документирует все такие объекты и четко указывает, что они не предназначены для вызова пользователем.Смотрите , например ,исходные коды для package grid в дистрибутиве R для примера.Обратите внимание, что пакеты, которые широко используют внутренние объекты, должны скрывать эти объекты в пространстве имен, когда их не нужно документировать (см. Пространства имен пакетов).
Вы можете использовать файл pkg-internal.Rd в качестве одного из вариантов, но если вы собираетесь использовать много скрытых объектов, это обычно обрабатывается в объявлениях в пространстве ИМЕН.
Другие советы
Вы загрузили RUnit
посылка?
Вероятно, вам лучше всего взглянуть на пакет, содержащий существующий код, используя RUnit
.