Как организовать большие программы R?

Нет, нет. Необходимо использовать префикс L (или макрос, такой как _T () с VC ++, который расширяется до L так или иначе, когда скомпилировано для Unicode).

157
задан smci 23 November 2014 в 03:03
поделиться

10 ответов

Стандартный ответ - использовать пакеты - см. Руководство Написание расширений R , а также различные руководства в Интернете.

Это дает вам

  • a квазиавтоматический способ организации вашего кода по темам
  • настоятельно рекомендует вам написать файл справки, заставляя вас думать об интерфейсе
  • , о множестве проверок работоспособности с помощью R CMD check
  • . возможность добавить регрессионные тесты
  • , а также средства для пространств имен

Простое выполнение source () над кодом работает для действительно коротких фрагментов. Все остальное должно быть в пакете - даже если вы не планируете его публиковать, поскольку вы можете писать внутренние пакеты для внутренних репозиториев.

Что касается части «как редактировать», руководство R Internals содержит отличные стандарты кодирования R в Разделе 6. В противном случае,

69
ответ дан 23 November 2019 в 21:47
поделиться

Я согласен с советом Дирка! IMHO, организация ваших программ от простых скриптов до документированных пакетов для программирования в R похожа на переключение с Word на TeX / LaTeX для написания. Я рекомендую взглянуть на очень полезный Создание R-пакетов: Учебник Фридриха Лейша.

19
ответ дан 23 November 2019 в 21:47
поделиться

Мой краткий ответ:

  1. Тщательно напишите свои функции, определив достаточно общие выходы и входы;
  2. Ограничьте использование глобальных переменных;
  3. Используйте объекты S3 и, где это возможно, Объекты S4;
  4. Поместите функции в пакеты, особенно когда ваши функции вызывают C / Fortran.

Я считаю, что R все больше и больше используется в производстве, поэтому потребность в повторно используемом коде больше, чем раньше. Я считаю, что интерпретатор намного надежнее, чем раньше. Нет сомнений в том, что R в 100-300 раз медленнее, чем C, но обычно узкое место сосредоточено вокруг нескольких строк кода, которые могут быть делегированы C / C ++. Я считаю, что было бы ошибкой делегировать сильные стороны R в обработке данных и статистическом анализе на другой язык. В этих случаях снижение производительности невелико, и в любом случае стоит сэкономить на разработке. Если бы дело было только во времени выполнения, мы бы все писали на ассемблере.

15
ответ дан 23 November 2019 в 21:47
поделиться

Я тоже согласен. Для начала используйте функцию package.skeleton (). Даже если вы думаете, что ваш код, возможно, никогда больше не будет запущен, это может помочь мотивировать вас к созданию более общего кода, который сэкономит вам время позже.

Что касается доступа к глобальной среде, то это легко сделать с помощью оператора << -, хотя это не рекомендуется.

4
ответ дан 23 November 2019 в 21:47
поделиться

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

-7
ответ дан 23 November 2019 в 21:47
поделиться

Еще не научившись писать пакеты, я всегда организовывал поиск субскриптов. Это похоже на уроки письма, но не так сильно. Это не программно элегантно, но я считаю, что со временем накапливаю анализы. Когда у меня есть большой рабочий раздел, я часто перемещаю его в другой скрипт и просто использую его, поскольку он будет использовать объекты рабочей области. Возможно, мне нужно импортировать данные из нескольких источников, отсортируйте их все и найдите пересечения. Я мог бы поместить этот раздел в дополнительный сценарий. Однако, если вы хотите распространить свое «приложение» для других людей или оно использует некоторый интерактивный ввод, пакет, вероятно, будет хорошим маршрутом. Как исследователь, мне редко нужно распространять свой код анализа, но МНЕ ЧАСТО нужно дополнять или настраивать его.

3
ответ дан 23 November 2019 в 21:47
поделиться

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

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

Насколько мелко / грубо вы делаете свои функции, будет различаться, и существуют различные практические правила: например, 15 строк кода , или " Затем я могу получить этот файл из любого другого скрипта.

Если вы собираетесь развернуть свои функции, вам нужно подумать о пакетах. Я не развертываю код R в производственной среде или для повторного использования другими по разным причинам (вкратце: корпоративная культура предпочитает другие языки, проблемы с производительностью, GPL и т. Д.). Кроме того, я стараюсь постоянно улучшать и добавлять в свои коллекции исходных файлов, и я бы предпочел не иметь дело с пакетами, когда вношу изменения. Поэтому вам следует ознакомиться с другими ответами, связанными с пакетами, например с ответами Дирка, для получения более подробной информации по этому поводу.

Наконец, я думаю, что ваш вопрос не обязательно относится к R. Я бы действительно рекомендовал прочитать Code Complete Стива МакКоннелла, который содержит много мудрости о таких проблемах и практике программирования в целом.

тогда вам нужно начать думать о пакетах. Я не развертываю код R в производственной среде или для повторного использования другими по разным причинам (вкратце: корпоративная культура предпочитает другие языки, проблемы с производительностью, GPL и т. Д.). Кроме того, я стараюсь постоянно улучшать и добавлять в свои коллекции исходных файлов, и я бы предпочел не иметь дело с пакетами, когда вношу изменения. Поэтому вам следует ознакомиться с другими ответами, связанными с пакетами, например с ответами Дирка, для получения более подробной информации по этому поводу.

Наконец, я думаю, что ваш вопрос не обязательно относится к R. Я бы действительно рекомендовал прочитать Code Complete Стива МакКоннелла, который содержит много мудрости о таких проблемах и практике кодирования в целом.

тогда вам нужно начать думать о пакетах. Я не развертываю код R в производственной среде или для повторного использования другими по разным причинам (вкратце: корпоративная культура предпочитает другие языки, проблемы с производительностью, GPL и т. Д.). Кроме того, я стараюсь постоянно улучшать и добавлять в свои коллекции исходных файлов, и я бы предпочел не иметь дело с пакетами, когда вношу изменения. Поэтому вам следует ознакомиться с другими ответами, связанными с пакетами, например с ответами Дирка, для получения более подробной информации по этому поводу.

Наконец, я думаю, что ваш вопрос не обязательно относится к R. Я бы действительно рекомендовал прочитать Code Complete Стива МакКоннелла, который содержит много мудрости о таких проблемах и практике кодирования в целом.

культура организации предпочитает другие языки, озабоченность производительностью, GPL и т. д.). Кроме того, я стараюсь постоянно улучшать и добавлять в свои коллекции исходных файлов, и я бы предпочел не иметь дело с пакетами, когда вношу изменения. Поэтому вам следует ознакомиться с другими ответами, связанными с пакетами, например с ответами Дирка, для получения более подробной информации по этому поводу.

Наконец, я думаю, что ваш вопрос не обязательно относится к R. Я бы действительно рекомендовал прочитать Code Complete Стива МакКоннелла, который содержит много мудрости о таких проблемах и практике кодирования в целом.

культура организации предпочитает другие языки, озабоченность производительностью, GPL и т. д.). Кроме того, я стараюсь постоянно улучшать и добавлять в свои коллекции исходных файлов, и я бы предпочел не иметь дело с пакетами, когда вношу изменения. Поэтому вам следует ознакомиться с другими ответами, связанными с пакетами, например с ответами Дирка, для получения более подробной информации по этому поводу.

Наконец, я думаю, что ваш вопрос не обязательно относится к R. Я бы действительно рекомендовал прочитать Code Complete Стива МакКоннелла, который содержит много мудрости о таких проблемах и практике программирования в целом.

33
ответ дан 23 November 2019 в 21:47
поделиться

Я хотел придумать, как писать пакеты, но не потратил на это время. Для каждого из моих мини-проектов я храню все свои низкоуровневые функции в папке с именем functions / и отправляю их в отдельное пространство имен, которое я явно создаю.

Следующие строки кода создадут среду с именем «myfuncs» в пути поиска, если он еще не существует (с помощью attach), и заполнить его функциями, содержащимися в файлах .r в моем каталоге «functions /» (с помощью sys.source). Я обычно помещаю эти строки в верхней части моего основного скрипта, предназначенного для «пользовательского интерфейса», из которого вызываются высокоуровневые функции (вызов низкоуровневых функций).

if( length(grep("^myfuncs$",search()))==0 )
  attach("myfuncs",pos=2)
for( f in list.files("functions","\\.r$",full=TRUE) )
  sys.source(f,pos.to.env(grep("^myfuncs$",search())))

Когда вы вносите изменения, вы всегда можете повторно использовать его такими же строчками, или используйте что-то вроде

evalq(f <- function(x) x * 2, pos.to.env(grep("^myfuncs$",search())))

для оценки дополнений / модификаций в среде, которую вы создали.

Я знаю, что это глупо, но избегает необходимости слишком формально об этом (но если у вас есть возможность, я поддерживаю систему пакетов - надеюсь Я перейду таким образом в будущем.

Что касается соглашений о кодировании, это единственное, что я видел в отношении эстетики (мне они нравятся и я свободно следую, но я не использую слишком много фигурных скобок в R):

http://www1.maths.lth.se/help/R/RCC/

Существуют и другие «соглашения» относительно использования [, drop = FALSE] и <- в качестве оператора присваивания, предлагаемого в различных презентации (обычно основные) для пользователя useR! конференции, но я не думаю, что какие-либо из них являются строгими (хотя [, drop = FALSE] полезен для программ, в которых вы не уверены в вводе, которое ожидаете).

Я знаю, что это глупо, но я избегаю слишком формального об этом (но если у вас будет возможность, я действительно поощряю систему пакетов - надеюсь, я перейду на этот путь в будущем).

Что касается соглашений о кодировании, это единственное, что я видел относительно эстетики (мне они нравятся и я вольно следую, но я не использую слишком много фигурных скобок в R):

http://www1.maths.lth.se/help/R / RCC /

Существуют и другие «соглашения» относительно использования [, drop = FALSE] и <- в качестве оператора присваивания, предлагаемого в различных презентациях (обычно в основных заметках) для пользователя useR! конференции, но я не думаю, что какие-либо из них являются строгими (хотя [, drop = FALSE] полезен для программ, в которых вы не уверены в вводе, которое ожидаете).

Я знаю, что это глупо, но я избегаю излишней формальности (но если у вас будет возможность, я действительно поощряю систему пакетов - надеюсь, я перейду на этот путь в будущем).

Что касается соглашений о кодировании, это единственное, что я видел относительно эстетики (мне они нравятся и я вольно следую, но я не использую слишком много фигурных скобок в R):

http://www1.maths.lth.se/help/R / RCC /

Существуют и другие «соглашения» относительно использования [, drop = FALSE] и <- в качестве оператора присваивания, предлагаемого в различных презентациях (обычно в основных заметках) для пользователя useR! конференции, но я не думаю, что какие-либо из них являются строгими (хотя [, drop = FALSE] полезен для программ, в которых вы не уверены в вводе, которое ожидаете).

но избегает слишком формального об этом (но если у вас будет возможность, я действительно поощряю систему пакетов - надеюсь, я перейду на этот путь в будущем).

Что касается соглашений о кодировании, это единственное, что я замечено в отношении эстетики (мне они нравятся и я свободно следую, но я не использую слишком много фигурных скобок в R):

http://www1.maths.lth.se/help/R/RCC/

Есть другие «соглашения» относительно использования [, drop = FALSE] и <- в качестве оператора присваивания, предлагаемого в различных презентациях (обычно в ключевых заметках) для пользователя useR! конференции, но я не думаю, что какие-либо из них являются строгими (хотя [, drop = FALSE] полезен для программ, в которых вы не уверены в вводе, которое ожидаете).

но избегает слишком формального об этом (но если у вас будет возможность, я действительно поощряю систему пакетов - надеюсь, я перейду на этот путь в будущем).

Что касается соглашений о кодировании, это единственное, что я замечено в отношении эстетики (мне они нравятся и я свободно следую, но я не использую слишком много фигурных скобок в R):

http://www1.maths.lth.se/help/R/RCC/

Есть другие "соглашения" относительно использования [, drop = FALSE] и <- в качестве оператора присваивания, предлагаемого в различных презентациях (обычно в основных заметках) для пользователя useR! конференции, но я не думаю, что какие-либо из них являются строгими (хотя [, drop = FALSE] полезен для программ, в которых вы не уверены в вводе, которое ожидаете).

это единственное, что я видел относительно эстетики (мне они нравятся и я вольно следую, но я не использую слишком много фигурных скобок в R):

http://www1.maths.lth.se/help/R / RCC /

Существуют и другие «соглашения» относительно использования [, drop = FALSE] и <- в качестве оператора присваивания, предлагаемого в различных презентациях (обычно в основных заметках) для пользователя useR! конференции, но я не думаю, что какие-либо из них являются строгими (хотя [, drop = FALSE] полезен для программ, в которых вы не уверены в вводе, которое ожидаете).

это единственное, что я видел относительно эстетики (мне они нравятся и я вольно следую, но я не использую слишком много фигурных скобок в R):

http://www1.maths.lth.se/help/R / RCC /

Существуют и другие «соглашения» относительно использования [, drop = FALSE] и <- в качестве оператора присваивания, предлагаемого в различных презентациях (обычно в основных заметках) для пользователя useR! конференции, но я не думаю, что какие-либо из них являются строгими (хотя [, drop = FALSE] полезен для программ, в которых вы не уверены в вводе, которое ожидаете).

- как оператор присваивания, предложенный в различных презентациях (обычно в основных выступлениях) для пользователя! конференции, но я не думаю, что какие-либо из них являются строгими (хотя [, drop = FALSE] полезен для программ, в которых вы не уверены в вводе, которое ожидаете).

- как оператор присваивания, предложенный в различных презентациях (обычно в основных выступлениях) для пользователя! конференции, но я не думаю, что какие-либо из них являются строгими (хотя [, drop = FALSE] полезен для программ, в которых вы не уверены в вводе, которое ожидаете).

11
ответ дан 23 November 2019 в 21:47
поделиться

Считайте меня другим человеком в пользу пакетов. Я признаю, что был довольно плох в написании man-страниц и виньеток до тех пор, пока я не буду / когда мне придется (то есть быть выпущенным), но это действительно удобный способ связать исходный код. Кроме того, если вы серьезно относитесь к поддержке своего кода, все вопросы, которые поднимает Дирк, будут уместны.

6
ответ дан 23 November 2019 в 21:47
поделиться

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

Но мне не нравится система пакетов R. Его довольно сложно использовать.

Я предпочитаю более легкую альтернативу, чтобы поместить функции файла в среду (то, что на других языках называется «пространством имен») и прикрепить ее. Например, я создал такую ​​группу функций «util»:

util = new.env()

util$bgrep = function [...]

util$timeit = function [...]

while("util" %in% search())
  detach("util")
attach(util)

Все это находится в файле util.R . Когда вы его исходите, вы получаете среду 'util', поэтому вы можете вызвать util $ bgrep () и тому подобное; но, кроме того, вызов attach () делает его так просто bgrep () и все это работает напрямую. Если бы вы не поместили все эти функции в их собственное окружение, они загрязнили бы пространство имен верхнего уровня интерпретатора (то, что показывает ls () ).

Я пытался смоделировать систему Python, где каждый файл представляет собой модуль. Было бы лучше, но вроде нормально.

50
ответ дан 23 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: