- •Написание собственных функций
- •1.1 Простые примеры
- •1.2 Определение новых бинарных операторов
- •1.3 Именованные параметры и умолчания
- •1.4 Параметр ‘...’
- •1.5 Присвоения в пределах функций
- •1.6 Область действия
- •1.7 Фактор эффективности при проектировании блоков
- •1.8 Отбрасывание всех имен при печатании массива
- •1.9 Рекурсивное числовое интегрирование
- •1.10 Настройка окружения
- •1.11 Классы, универсальные функции и объектно-ориентированное программирование
- •Статистические модели в r
- •2.1 Определение статистических моделей; формулы
- •2.2 Линейные модели
- •2.3 Универсальные функции для извлечения информации о модели
- •2.4 Дисперсионный анализ и сравнение модели
- •2.5 Обновление подогнанных моделей
- •Графические процедуры
- •3.1 Высокоуровневые команды рисования
- •3.2 Функция plot()
- •3.3 Отображение многомерных данных
- •3.4 Графический вывод
- •3.5 Математическая аннотация
- •3.6 Интерактивная графика
- •3.7 Использование графических параметров
- •Список використаної літератури
1.3 Именованные параметры и умолчания
Как сначала отмечено в Разделе 2.3 [Генерация последовательности Коши], если параметры вызванным функциям переданы в форме “name=object”, то их можно передать в любом порядке. Кроме того, последовательность параметров может начинаться без имен, в позиционной форме, и указывать параметры, передаваемые по имени после позиционных параметров.
Таким образом, если существует функция fun1, определенная как:
> fun1 <- function(data, data.frame, graph, limit) {
[тело функции опущено]
}
то функция может быть вызвана несколькими эквивалентными способами, например:
> ans <- fun1(d, df, TRUE, 20)
> ans <- fun1(d, df, graph=TRUE, limit=20)
> ans <- fun1(data=d, limit=20, graph=TRUE, data.frame=df)
Во многих случаях параметрам можно дать обычно соответствующие значения по умолчанию, тогда они могут быть опущены в целом от вызова, когда соответствуют умолчанию. Например, если fun1была определена как:
> fun1 <- function(data, data.frame, graph=TRUE, limit=20) { ... }
в котором изменяется один из параметров на умолчания.
Важно отметить, что по умолчанию могут быть произвольными выражениями, даже вовлеченные другими аргументами той же самой функции; они не ограничены быть константами как здесь в нашем простом примере.
1.4 Параметр ‘...’
Другое частое требование состоит в предоставлении одной функции передавать установки аргументов другой. Например, много графических функций используют функцию par(),и функции подобнуюplot(),позволяя пользователю передавать графические параметры par(), чтобы управлять графическим выводом. См. Раздел 12.4.1[Par() функция],для большего количества деталей о функцииpar().Это может быть сделано включением дополнительного параметра функции буквально ‘...’, которая может затем может быть передана. Пример схемы дан ниже.
fun1 <- function(data, data.frame, graph=TRUE, limit=20, ...) {
[пропущенный оператор] if (graph) par(pch="*", ...)
[дальнейшие пропуски]
}
Реже функции необходимо сослаться на компонент ‘…’. Выражениеlist(….)оценивает все такие параметры и возвращает их в именованном списке, хотя …1, …2, и т.д. оценивает их один раз с возвращением “…n’ для n-го не сопоставленного параметра.
1.5 Присвоения в пределах функций
Заметим, что любые обычные присвоения, сделанные в пределах функции, являются локальными и временными и теряются после выхода из функции. Таким образом, присвоение X <-qr (X)не влияет на значение аргумента в вызывающей программе.
Чтобы понять полностью правила, управляющие контекстом присвоений R, читателю необходимо ознакомится с понятием вычисления фрейма. Это несколько углубленное знание, хотя вряд ли сложное, однако тема в дальнейшем не будет здесь рассматриваться.
Если требуются глобальные и постоянные присвоения в пределах функции, то может быть использован или оператор "суперприсвоения" <<-,или функцияassign().Подробнее смотри документацию. Пользователи S-Plus должны знать, что<<-имеет отличающуюся семантику в R . Эти вопросы обсуждаются далее вРазделе 10.7 [Контекст].
1.6 Область действия
Обсуждение в этом разделе является несколько более схематичным, чем в других частях этого документа. Однако детализируется одно из существенных различий между S-Plus и R .
Символы в теле функции могут быть разделены на три класса: формальные параметры, локальные переменные и свободные переменные. Формальные параметры функции это те, которые возникли в списке параметров функции. Их значение определяется процессом связывания фактических аргументов функции с формальными аргументами. Локальные переменные это те, значение которых определено оценкой выражений в теле функций. Переменные, которые не являются формальными параметрами или локальными переменными, называют свободными переменными. Свободные переменные становятся локальными переменными, если им они присваиваются. Рассмотрим следующее определение функции.
f <- function(x) { y <- 2*x print(x) print(y) print(z) }
В этой функции x- формальный параметр,y- локальная переменная.
В R связывание свободной переменной разрешается сначала путем поиска в области, в которой создавалась функция. Это называют лексическим контекстом. Сначала определим функцию cube.
cube <- function(n) { sq <- function() n*n n*sq()
}
Переменная n в функции sqне является аргументом этой функции. Поэтому - это свободная переменная, и следует использовать правила области действия, чтобы установить значение, которое должно быть ей назначено. Согласно статической области действия (S-Plus) значение определяется глобальной переменной с именемn.В области действия (R) она является параметром функцииcube, так как это активное связывание переменнойnв момент определения функцияsq. Разность между оценкой в R и оценкой в S-Plus в том, что S-Plus ищет глобальную переменную с именемn, а R сначала ищет переменную с именем n в окружении, созданном после определенияcube.
## сначала вычислим в S
S> cube(2)
Error in sq(): Object "n" not found
Dumped
S> n <- 3
S> cube(2)
[1] 18
## затем та же функция, вычисленная в R
R > cube(2)
[1] 8
Также лексический контекст может использоваться для изменения состояния функциям. В следующем примере покажем, как можно использовать R для имитации банковского счета. У функционирующего банковского счета должны быть баланс или итог, функция для вывода средств, функция для формирования депозитов и функция определения текущего баланса. Это достигается путем создания трех функций в внутри счета (account),а затем возвращения списка, содержащего их. Когда счет(account)заводится, то он принимает числовой аргументtotalи возвращает список, содержащий три функции. Поскольку эти функции определены в среде, которая содержитtotal, у них будет доступ к ее значению.
Специальный оператор присваивания `<<-` используется для изменения значения, связанного сtotal. Этот оператор делает обратный проход в окружающие среды, которые содержит символtotal, и когда он находит такую среду, то заменяет значение в той среде значением с правой стороны. Если среда глобального или верхнего уровня достигнута, не находя символаtotal, то создается переменная и там присваивается. Для большинства пользователей<<-создает глобальную переменную и присваивает ей значение правой стороны. Лишь когда<<-использовался в функции, которая вернула в качестве значения другой функции, то возникает специальный режим, описанный здесь.
open.account <- function(total) {
list(
deposit = function(amount) { if(amount <= 0) stop("Deposits must be positive!\n") total <<- total + amount
cat(amount, "deposited. Your balance is", total, "\n\n")
},
withdraw = function(amount) { if(amount > total) stop("You don’t have that much money!\n") total <<- total - amount
cat(amount, "withdrawn. Your balance is", total, "\n\n")
},
balance = function() { cat("Your balance is", total, "\n\n") }
)
}
ross <- open.account(100)
robert <- open.account(200)
ross$withdraw(30) ross$balance()
robert$balance()
ross$deposit(50) ross$balance() ross$withdraw(500)