Что делать с несовершенными, но полезными функциями? - PullRequest
13 голосов
/ 26 июля 2011

Я мог бы также озаглавить этот вопрос: «Достаточно ли это хорошо для 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, классы для обработки и преобразования между типами геопространственных объектов и выполнения различных ГИС-операций). подобные операции, такие как оверлеи).

Я хотел бы сделать их доступными где-нибудь в Интернете в R-форме (например, публикация их в блоге в виде простых текстовых функций - это не то, что мне нужно), чтобы их обслуживание было проще и чтобы я и другие могут получить к ним доступ с любого компьютера, на который я захожу. Логичная вещь - сделать из них пакет и опубликовать его в CRAN - и я действительно уже упаковал его. Но подходит ли этот набор функций для пакета CRAN?

У меня есть две основные проблемы:

  1. Кажется, что функции не имеют никакого связанного наложения. Это просто коллекция функций, которые делают много разных вещей.
  2. Мой код не всегда самый красивый. Я пытался очистить его, как я выучил лучшие практики кодирования, но создавал R Core-достойный красивый код отсутствует в карточках.

На веб-странице CRAN неожиданно отсутствуют руководящие принципы размещения. Должен ли я публиковать в CRAN, учитывая, что некоторые люди сочтут это полезным, но что в некотором смысле это навсегда заблокирует R для использования некоторых довольно простых имен функций? Или есть другое место, где я могу использовать команду install.packages-like для установки? Примечание. Я бы предпочел не публиковать пакет на веб-странице и не заставлять людей запоминать URL-адрес для установки пакета (не в последнюю очередь из-за проблем с управлением версиями).

Ответы [ 3 ]

5 голосов
/ 26 июля 2011

Я бы использовал http://r -forge.r-project.org / .В верхней части страницы:

R-Forge предлагает центральную платформу для разработки пакетов R, программного обеспечения, связанных с R, и других проектов.Он основан на FusionForge, обеспечивающем легкий доступ к лучшим в SVN, ежедневно создаваемые и проверенные пакеты, списки рассылки, отслеживание ошибок, доски объявлений / форумы, хостинг сайтов, постоянное архивирование файлов, полное резервное копирование и полное администрирование через Интернет.*

4 голосов
/ 26 июля 2011

Большинство пакетов должны быть коллекциями связанных функций с очевидной целью, поэтому полезно было бы попытаться сгруппировать то, что у вас есть, и посмотреть, сможете ли вы их классифицировать. Несколько небольших пакетов лучше, чем одна огромная несвязная упаковка.

Тем не менее, есть несколько пакетов, которые представляют собой наборы различных служебных функций, в частности, Hmisc и gregmisc, так что все в порядке. Если у вас просто есть несколько подобных функций, возможно, стоит связаться с автором некоторых пакетов misc и узнать, позволят ли они включить ваш код в их пакет.

Что касается написания красивого кода, самое важное, что вы можете сделать, это использовать руководство по стилю .

1 голос
/ 14 августа 2016

По моему мнению, не стоит делать материал такого типа в упаковках.
Разные пакеты существуют, но в основном по историческим причинам и / или из-за их авторитетных авторов, см. Frank Harrell Hmisc.

Я вижу три основные причины, по которым этот выбор не подходит для разнородного набора функций.

  1. В целом только 7000 пакетов на CRAN. Маловероятно, что ваш пакет будет выбран, если он не нацелен на определенное поле, и даже когда это происходит, вполне возможно, что другие установленные пакеты будут делать то же самое. Поэтому ваша посылка должна также иметь оригинальное / лучшее решение проблемы, с которой она связана.

  2. Репозитории, в частности CRAN, ориентированы на задачи, что предполагает, что функции пакетов должны решать согласованную задачу. И на то есть веская причина: нет смысла загружать целый пакет с, скажем, 50 автономными функциями, когда мне нужна всего пара из них. Вместо этого, если пакет решает конкретную проблему с данными, мне, скорее всего, понадобится большинство (если не все) из них.

  3. Репозитории R имеют тенденцию маскировать содержимое. В отличие от технических блогов, вы не сразу видите источник функций. Вам необходимо загрузить отдельный пакет с исходным кодом, и это связано с большими издержками из-за структуры пакета, в которой скрыты фактические функции, которые вы хотите показать, а остальные должны прочитать.

На мой взгляд, лучшим местом для общих функций удобства являются такие сайты, как GitHub. На самом деле:

  1. Их сразу же читают с удобной подсветкой синтаксиса. Если они интересны, их можно вставить в R, чтобы попробовать и, возможно, сохранить их, в противном случае нужно просто перейти к следующей функции.

  2. Существует возможность организации кода, но без всех ограничений реального пакета. Аналогичные функции могут находиться в одном и том же файле, а согласованные файлы - в одной подпапке.

  3. Вы можете показать свои идеи другим простым способом. Файл readme может сразу стать своего рода мини-страницей (через уценку). В сравнении CRAN довольно жесткий.

Существует множество других преимуществ (история изменений, принятие вкладов, страницы GitHub), которые могут вас заинтересовать или не заинтересовать.

Конечно, после того, как несколько функций будут развиваться в стабильном последовательном направлении, вы превратите их в настоящий пакет CRAN. Кроме того, потому что метод копирования и вставки, чтобы попробовать их, становится неудобным.

РЕДАКТИРОВАТЬ: В настоящее время есть альтернативы GitHub, которые также могут быть приняты во внимание, и GitHub стал распространенным способом распространения пакетов, еще не готовых для CRAN, или интеграции официальной страницы распространения CRAN.

...