Нет, нет. Необходимо использовать префикс L (или макрос, такой как _T () с VC ++, который расширяется до L так или иначе, когда скомпилировано для Unicode).
Стандартный ответ - использовать пакеты - см. Руководство Написание расширений R , а также различные руководства в Интернете.
Это дает вам
R CMD check
Простое выполнение source ()
над кодом работает для действительно коротких фрагментов. Все остальное должно быть в пакете - даже если вы не планируете его публиковать, поскольку вы можете писать внутренние пакеты для внутренних репозиториев.
Что касается части «как редактировать», руководство R Internals содержит отличные стандарты кодирования R в Разделе 6. В противном случае,
Я согласен с советом Дирка! IMHO, организация ваших программ от простых скриптов до документированных пакетов для программирования в R похожа на переключение с Word на TeX / LaTeX для написания. Я рекомендую взглянуть на очень полезный Создание R-пакетов: Учебник Фридриха Лейша.
Мой краткий ответ:
Я считаю, что R все больше и больше используется в производстве, поэтому потребность в повторно используемом коде больше, чем раньше. Я считаю, что интерпретатор намного надежнее, чем раньше. Нет сомнений в том, что R в 100-300 раз медленнее, чем C, но обычно узкое место сосредоточено вокруг нескольких строк кода, которые могут быть делегированы C / C ++. Я считаю, что было бы ошибкой делегировать сильные стороны R в обработке данных и статистическом анализе на другой язык. В этих случаях снижение производительности невелико, и в любом случае стоит сэкономить на разработке. Если бы дело было только во времени выполнения, мы бы все писали на ассемблере.
Я тоже согласен. Для начала используйте функцию package.skeleton (). Даже если вы думаете, что ваш код, возможно, никогда больше не будет запущен, это может помочь мотивировать вас к созданию более общего кода, который сэкономит вам время позже.
Что касается доступа к глобальной среде, то это легко сделать с помощью оператора << -, хотя это не рекомендуется.
R подходит для интерактивного использования и небольших скриптов, но я бы не стал использовать его для больших программ. Я бы использовал основной язык для большей части программирования и обернул его в интерфейс R.
Еще не научившись писать пакеты, я всегда организовывал поиск субскриптов. Это похоже на уроки письма, но не так сильно. Это не программно элегантно, но я считаю, что со временем накапливаю анализы. Когда у меня есть большой рабочий раздел, я часто перемещаю его в другой скрипт и просто использую его, поскольку он будет использовать объекты рабочей области. Возможно, мне нужно импортировать данные из нескольких источников, отсортируйте их все и найдите пересечения. Я мог бы поместить этот раздел в дополнительный сценарий. Однако, если вы хотите распространить свое «приложение» для других людей или оно использует некоторый интерактивный ввод, пакет, вероятно, будет хорошим маршрутом. Как исследователь, мне редко нужно распространять свой код анализа, но МНЕ ЧАСТО нужно дополнять или настраивать его.
Это может показаться немного очевидным, особенно если вы программист, но вот что я думаю о логических и физических единицах кода.
Я не знаю, относится ли это к вашему случаю. , но когда я работаю в 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 Стива МакКоннелла, который содержит много мудрости о таких проблемах и практике программирования в целом.
Я хотел придумать, как писать пакеты, но не потратил на это время. Для каждого из моих мини-проектов я храню все свои низкоуровневые функции в папке с именем 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] полезен для программ, в которых вы не уверены в вводе, которое ожидаете).Считайте меня другим человеком в пользу пакетов. Я признаю, что был довольно плох в написании man-страниц и виньеток до тех пор, пока я не буду / когда мне придется (то есть быть выпущенным), но это действительно удобный способ связать исходный код. Кроме того, если вы серьезно относитесь к поддержке своего кода, все вопросы, которые поднимает Дирк, будут уместны.
Мне нравится помещать различные функции в их собственные файлы.
Но мне не нравится система пакетов 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, где каждый файл представляет собой модуль. Было бы лучше, но вроде нормально.