Изменения

Перейти к: навигация, поиск

R:Оформление кода

3532 байта добавлено, 04:37, 16 апреля 2014
м
Функция tidy.source()
Прежде всего, названия файлов должны быть '''осмысленными''' и понятными.
Общим требования к именованию файлов является написания расширений файлов, включающего принадлежность к языку программирования R с большой буквы. Обратим внимание, что все UNIX-like операционные системы чувствительны к регистру в названиях файлов. Например: {{Inline-<code|>pulse-analyse.R</code>, <code>report.Rmw</code>, <code>presentation.Rmd|lang="bash"}}</code>. Бинарный формат хранения данных имеет расширение {{Inline-<code|>.RData|lang="bash"}}</code>.
Имена файлов содержат символы в нижнем регистре.
Существуют различные подходы к именованию функций и переменных. Но все они содержат общие рекомендации:
* Названия должны быть понятны и осмысленны: {{Inline-<code|>colMeans|lang="rsplus"}}</code>, {{Inline-<code|>read.table|lang="rsplus"}}</code>;
* Названия не должны быть слишком длинными или слишком короткими, что могли бы затруднить их понимание или восприятие;
* Не использовать имена уже используются в R или популярных пакетах. Для проверки уже используемых имён можно использовать функции {{Inline-<code|>find()|lang="rsplus"}} </code> и {{Inline-<code|>apropos()|lang="rsplus"}}</code>;
Можно выделить несколько подходов к именованию функций и переменных:
* alllowercase (слитное написание, все символы в нижнем регистре, без разделителей). Широко используется в MATLAB. Примеры: {{Inline-<code|>searchpaths|lang="rsplus"}}</code>, {{Inline-<code|>searchpaths|lang="rsplus"}}</code>;* period.separated (все символы в нижнем регистре с разделителями в виде точек). Используется только в R. Примеры: {{Inline-<code|>as.numeric|lang="rsplus"}}</code>, {{Inline-<code|>read.table|lang="rsplus"}}</code>, {{Inline-<code|>data.frame|lang="rsplus"}}</code>;* underscore_separated (все символы в нижнем регистре с разделителями в виде нижних подчёркиваний). Используется дл именования переменных и функций в C++, Perl, Ruby. Примеры: {{Inline-<code|>package_version|lang="rsplus"}}</code>, {{Inline-<code|>seq_along|lang="rsplus"}}</code>;* lowerCamelCase (слитное написание, первый символ в нижнем регистре, начало каждого составного слова в верхнем регистре). Используется во многих языках программирования. Примеры: {{Inline-<code|>colMeans|lang="rsplus"}}</code>, {{Inline-<code|>suppressPackageStartupMessage.|lang="rsplus"}}</code>;* UpperCamelCase (слитное написание, первый символ в верхнем регистре, начало каждого составного слова в верхнем регистре). Используется во многих языках программирования. Примеры: {{Inline-<code|>Vectorize|lang="rsplus"}}</code>, {{Inline-<code|>NextMethod|lang="rsplus"}}</code>;
В различных руководствах приводятся разные рекомендации. Как мы уже отмечали, гораздо более важно придерживаться единого стиля при написании кода. В исходном коде R преимущественно используются стили lowerCamelCase, period.separated и underscore_separated. При этом period.separated, как уже отмечалось выше, используется в основном для создания функций для обработки S3 классов.
Пробелы ставятся '''до''' и '''после''' математических символов и бинарных или логических операторов:
* математические символы: <tt>«=», «+», «-», «*», «/»</tt>;* операторы присвоения: <tt>«<-», «->»</tt>;* бинарные операторы: <tt>«%in%», «%%», «%/%»</tt>;* логические операторы: <tt>«==», «!=», «&», «|», «<», «>», «<=», «>=»</tt>.
Пробелы также ставятся '''после''' запятых.
Пробелы ставятся '''перед''' открывающейся фигурной скобкой - <tt>«{»</tt>.
Пробелы ставятся '''перед''' открывающейся круглой скобкой - <tt>«(»</tt>, за исключением объявления или вызова функции.
Пробелы также '''не''' ставятся между круглыми скобками:
<syntaxhighlight lang{{r-code|code="rsplus"<nowiki>if ( (x == 1) & (y == 2) )</syntaxhighlightnowiki>}}
Более корректно:
<syntaxhighlight lang{{r-code|code="rsplus"<nowiki>if ((x == 1) & (y == 2))</syntaxhighlightnowiki>}}
Рекомендуется отделять пробелами оператор присвоения значений аргументов:
{{r-code|code=<syntaxhighlight lang="rsplus"nowiki>plot(x,y, lwd=4, col=green, main="My Title")</syntaxhighlightnowiki>}}
Более корректно:
<syntaxhighlight lang{{r-code|code="rsplus"<nowiki>plot(x,y, lwd = 4, col = green, main = "My Title")</nowiki>}} == Функция <code>tidy.source()</syntaxhighlightcode>== Пакет {{r-package|formatR}} содержит функцию <code>tidy.source()</code>, которая позволяет отформатировать исходный код согласно заранее определённым правилам (аргументам). Функция поддерживает ввод из буфера обмена (<code>source = "clipboard"</code>), файла (<code>source = "filename"</code>) или переменной (<code>source = varname</code>), являющейся вектором строк (character vector). Вывод результатов работы функции может быть перенаправлен в консоль (<code>output = TRUE</code>) или файл (<code>file = "filename"</code>). В качестве настроек форматирования можно указать: * сохранять комментарии (аргумент <code>keep.comment</code>, по умолчанию <code>TRUE</code>);* сохранять пустые строки (аргумент <code>keep.blank.line</code>, по умолчанию <code>TRUE</code>);* заменять оператор присвоения с <code>=</code> на <code><-</code> (аргумент <code>replace.assign</code>, по умолчанию <code>FALSE</code>);* ставить открывающуюся фигурную скобку (<code>{</code>) на новую строку (аргумент <code>left.brace.newline</code>, по умолчанию <code>FALSE</code>);* количество пробелов, использующихся для отступов (аргумент <code>reindent.spaces</code>. по умолчанию 4 пробела);* количество символов, при достижении которого текст переносится на новую строку (аргумент <code>idth.cutoff</code>, по умолчанию равен опции <code>width</code>). Для демонстрации работы функции <code>tidy.source()</code> возьмём файл <code>messy.R</code>, который поставляется в составе пакета {{r-package|formatR}}. Вот его содержимое: {{file |filename=messy.R |lang=r |code=<nowiki> # a single line of comments is preserved1+1 if(TRUE){x=1 # inline comments}else{x=2;print('Oh no... ask the right bracket to go away!')}1*3 # one space before this comment will become two!2+2+2 # 'short comments' lm(y~x1+x2, data=data.frame(y=rnorm(100),x1=rnorm(100),x2=rnorm(100))) ### only 'single quotes' are allowed in comments1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1 ## comments after a long line'a character string with \t in it' ## here is a long long long long long long long long long long long long long long long long long long long long comment</nowiki>}} Результат работы функции: {{r-code |code=<nowiki>> library(formatR)> options(width = 80)> tidy.source(source = paste0(.libPaths()[1], "/formatR/format/messy.R"))# a single line of comments is preserved1 + 1 if (TRUE) { x <- 1 # inline comments} else { x <- 2 print("Oh no... ask the right bracket to go away!")}1 * 3 # one space before this comment will become two!2 + 2 + 2 # 'short comments' lm(y ~ x1 + x2, data = data.frame(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100))) ### only 'single quotes' are allowed in comments1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 ## comments after a long line"a character string with \t in it" ## here is a long long long long long long long long long long long long long long## long long long long long long comment</nowiki>}}
== Общая логика и порядок написания скриптов ==
# Комментарий, содержащий информацию об авторе;
# Комментарий, содержащий информацию о содержании и назначении скрипта;
# Импорт пакетов и скриптов - вызов {{Inline-<code|>library()|lang="rsplus"}} </code> и {{Inline-<code|>source()|lang="rsplus"}}</code>;
# Объявления функций:
# Выполнение основный выражений.
=== Ссылки ===
 
* R Style. An Rchaeological Commentary - http://cran.r-project.org/web/packages/rockchalk/vignettes/Rstyle.pdf
* Google's R Style Guide - http://google-styleguide.googlecode.com/svn/trunk/Rguide.xml

Навигация