Что делать с несовершенными, но полезными функциями?
Я мог бы также назвать этот вопрос: "Это достаточно хорошо для CRAN?"
У меня есть набор функций, которые я создал для определенных задач. Некоторые из них - удобные функции:
# Returns odds/evens from a vector
odds=function(vec) {
stopifnot(class(vec)=="integer")
ret = vec[fpart(vec/2)!=0]
ret
}
evens=function(vec) {
stopifnot(class(vec)=="integer")
ret = vec[fpart(vec/2)==0]
ret
}
Некоторые из них являются незначительными дополнениями, которые оказались полезными при ответе на обычный вопрос SO:
# Shift a vector over by n spots
# wrap adds the entry at the beginning to the end
# pad does nothing unless wrap is false, in which case it specifies whether to pad with NAs
shift <- function(vec,n=1,wrap=TRUE,pad=FALSE) {
if(length(vec)<abs(n)) {
#stop("Length of vector must be greater than the magnitude of n \n")
}
if(n==0) {
return(vec)
} else if(length(vec)==n) {
# return empty
length(vec) <- 0
return(vec)
} else if(n>0) {
returnvec <- vec[seq(n+1,length(vec) )]
if(wrap) {
returnvec <- c(returnvec,vec[seq(n)])
} else if(pad) {
returnvec <- c(returnvec,rep(NA,n))
}
} else if(n<0) {
returnvec <- vec[seq(1,length(vec)-abs(n))]
if(wrap) {
returnvec <- c( vec[seq(length(vec)-abs(n)+1,length(vec))], returnvec )
} else if(pad) {
returnvec <- c( rep(NA,abs(n)), returnvec )
}
}
return(returnvec)
}
Наиболее важными являются расширения существующих классов, которые не могут быть найдены нигде (например, функция панели CDF для графиков решетки, различные функции вывода xtable и LaTeX, классы для обработки и преобразования между типами геопространственных объектов и выполнения различных GIS- подобные операции, такие как наложения).
Я хотел бы сделать их доступными где-нибудь в Интернете в R-ized форме (например, размещать их в блоге, поскольку обычные текстовые функции не то, что я ищу), так что обслуживание упрощается и поэтому я и другие могут получить к ним доступ с любого компьютера, к которому я иду. Логично сделать, чтобы сделать из них пакет и отправить их в CRAN - и действительно, я уже их упаковал. Но является ли этот набор функций подходящим для пакета CRAN?
У меня есть две основные проблемы:
- Функции, похоже, не имеют согласованного наложения. Это просто
набор функций, которые делают много разных вещей.
- Мой код не всегда самый красивый. Я пытался его очистить, поскольку я
выучили более лучшие методы кодирования, но производя R Core-достойные красивые
код не находится в карточках.
Веб-страница CRAN удивительно лишена рекомендаций по публикации. Должен ли я отправлять сообщения в CRAN, учитывая, что некоторые люди посчитают это полезным, но что он в каком-то смысле навсегда заблокирует R, чтобы иметь некоторые довольно основные имена функций? Или есть другое место, где я могу использовать команду install.packages-like для установки? Примечание. Я бы предпочел не размещать пакет на веб-странице и иметь людей для запоминания URL-адреса для установки пакета (не в последнюю очередь для проблем с управлением версиями).
Ответы
Ответ 1
Большинство пакетов должны быть коллекциями связанных функций с очевидной целью, поэтому полезно было бы попытаться сгруппировать то, что у вас есть, и посмотреть, можете ли вы их классифицировать. Несколько меньших пакетов лучше, чем один огромный непоследовательный пакет.
Тем не менее, есть несколько пакетов, которые представляют собой коллекцию различных служебных функций, в первую очередь Hmisc
и gregmisc
, поэтому все в порядке. Если у вас есть только несколько таких функций, возможно, стоит обратиться к автору некоторых из разных пакетов и посмотреть, разрешат ли они включить ваш код в свой пакет.
Что касается написания красивого кода, самое важное, что вы можете сделать, это использовать руководство по стилю.
Ответ 2
Я бы использовал http://r-forge.r-project.org/. В верхней части страницы:
R-Forge предлагает центральную платформу для разработки пакетов R, R-связанное программное обеспечение и дальнейшие проекты. Он основан на FusionForge предлагая легкий доступ к лучшим в SVN, ежедневно построенный и проверенный пакеты, списки рассылки, отслеживание ошибок, доски объявлений/форумы, сайт хостинг, постоянное архивирование файлов, полное резервное копирование и общий веб-интерфейс введение.
Ответ 3
По моему мнению, не стоит делать материал такого типа в упаковках.
Misc-пакеты существуют, но в основном по историческим причинам и/или из-за их авторитетных авторов, см. Frank Harrell Hmisc.
Я вижу три основные причины, по которым этот выбор не подходит для разнородного набора функций.
-
По большому счету только 7000 пакетов на CRAN. Маловероятно, что ваш пакет будет выбран, если он не нацелен на определенное поле, и даже когда это происходит, вполне возможно, что другие установленные пакеты будут делать то же самое. Поэтому ваша посылка должна также иметь оригинальное/лучшее решение проблемы, с которой она связана.
-
Хранилища, и в частности CRAN, ориентированы на задачи, что предполагает, что функции пакетов должны решать согласованную задачу. И на то есть веская причина: нет смысла загружать целый пакет, скажем, с 50 автономными функциями, когда мне нужна только пара из них. Вместо этого, если пакет решает конкретную проблему с данными, мне, скорее всего, понадобится большинство (если не все) из них.
-
Репозитории R имеют тенденцию маскировать содержимое. В отличие от технических блогов, вы не сразу видите источник функций. Вам необходимо скачать отдельный пакет с исходным кодом, и это связано с большими издержками из-за структуры пакета, в которой скрыты фактические функции, которые вы хотите показать, а остальные должны прочитать.
На мой взгляд, лучшее место для общих удобных функций - это сайты типа GitHub. По факту:
-
Один сразу же читает их с комфортом подсветки синтаксиса. Если они интересны, их можно вставить в R, чтобы попробовать и, возможно, сохранить их, в противном случае нужно просто перейти к следующей функции.
-
Существует возможность организации кода, но без всех ограничений реального пакета. Аналогичные функции могут находиться в одном и том же файле, а согласованные файлы в одной подпапке.
-
Вы можете показать свои идеи другим простым способом. Файл readme может сразу стать своего рода мини-страницей (через уценку). В сравнении CRAN довольно жесткий.
Существует множество других преимуществ (история изменений, принятие вкладов, страницы GitHub), которые могут вас заинтересовать или не заинтересовать.
Конечно, после того, как несколько функций вырастут в устойчивом последовательном направлении, вы превратите их в настоящий пакет CRAN. Кроме того, потому что метод копирования и вставки, чтобы попробовать их, становится неудобным.
РЕДАКТИРОВАТЬ: В настоящее время есть альтернативы GitHub, которые также могут быть приняты во внимание, и GitHub стал распространенным способом распространения пакетов, еще не готовых для CRAN, или интеграции официальной страницы распространения CRAN.