- •Написание собственных функций
- •Простые примеры
- •Определение новых бинарных операторов
- •Именованные параметры и умолчания
- •Параметр ‘...’
- •Присвоения в пределах функций
- •Более сложные примеры
- •Фактор эффективности при проектировании блоков
- •Отбрасывание всех имен при печатании массива
- •Рекурсивное числовое интегрирование
- •Область действия
- •Настройка окружения
- •Классы, универсальные функции и объектно-ориентированное программирование
- •Статистические модели в r
- •Определение статистических моделей; формулы
- •Примеры
- •Противопоставления
- •Линейные модели
- •Универсальные функции для извлечения информации о модели
- •Дисперсионный анализ и сравнение модели
- •Таблицы anova
- •Обновление подогнанных моделей
- •Обобщенные линейные модели
- •Семейства
- •Функция glm()
- •Нелинейные наименьшие квадраты и модели наибольшего правдоподобия
- •Наименьшие квадраты
- •Метод максимального правдоподобия
- •Некоторые нестандартные модели
Написание собственных функций
Из неформальных примеров видно, что язык R позволяет пользователю создавать объекты режима функции. Существуют реальные функции R, которые хранятся в специальной внутренней форме и могут использоваться в дальнейших выражениях и так далее. В процессе язык чрезвычайно усилился в мощности, удобстве и элегантности, и обучение написанию полезных функций являются одним из основных способов сделать использование R удобным и производительным.
Нужно подчеркнуть, что большинство функций, предоставленных как часть системы R, таких как mean(), var(), postscript() и так далее, сами написаны на R и, таким образом, существенно не отличается от написанных пользователем функций. Функция определена присвоением вида:
> name <- function(arg_1, arg_2, ...) expression
expression это выражение R, (обычное групповое выражение), которое использует параметры arg_i для вычисления значения. Значение выражения – это значение, возвращаемое функцией.
Обычно в этом случае вызов функции затем обычно берет имя формулы name(expr_1, expr_2...) и может выполняться везде, где допустим вызов функции.
Простые примеры
Как первый пример, рассмотрим функцию, вычисляющую t-статистики двух выборок с показом “всех шагов”. Это - искусственный пример, конечно, так как есть другие, более простые способы достижения той же самой цели. Функция определена следующим образом:
> twosam <- function(y1, y2) { n1 <- length(y1); n2 <- length(y2) yb1 <- mean(y1); yb2 <- mean(y2) s1 <- var(y1); s2 <- var(y2) s <- ((n1-1)*s1 + (n2-1)*s2)/(n1+n2-2)
tst <- (yb1 - yb2)/sqrt(s*(1/n1 + 1/n2)) tst }
С этой определенной функцией, можно выполнить t-тест для двух выборок, используя такой вызов:
> tstat <-twosam (data$male, data$female); tstat
В качестве второго примера рассмотрим функцию, непосредственно эмулирующую команду наклонной черты влево Matlab, которая возвращает коэффициенты ортогональной проекции вектора y на пространство столбца матрицы X. Это обычно называют оценкой коэффициентов регрессии методом наименьших квадратов. Это обычно делалось бы функцией qr(); однако это иногда немного мудрено, чтобы использовать непосредственно, и проще иметь простую функцию как ниже для безопасного использования.
Таким образом, учитывая n-на-1 вектор y и n-на-p матрицу X, то X y определены как (XTX)-XTy, где (XTX)- является обобщенной инверсией X’X.
> bslash <- function(X, y) {
X <- qr(X)
qr.coef(X, y)
}
После создания объекта, он может использоваться в таких операторах как: > regcoeff <-bslash (Xmat, yvar) и так далее.
Классическая функция R lsfit() делает это задание лучше. В свою очередь используются функции qr() и qr.coef() немного парадоксальным способом для выполнения своей части вычислений. Следовательно, существует, вероятно, некоторый смысл в простом выделении только этой части для использования функции в частом употреблении. Если так, то можно сделать это матричным бинарным оператором для более удобного использования.
Определение новых бинарных операторов
Если дать функции bslash() другое имя, а именно одной из форм: %anything%
то это, возможно, использовалось бы в качестве бинарного оператора в выражениях, а не в форме функции. Предположим, например, мы выбираем ! для внутреннего символа. Определение функции тогда бы начиналось как:
> "%!%" <- function(X, y) { ... }
Заметим использование двойных кавычек. Затем функцию можно использовать как X%!%y. Символ самой наклонной черты влево не удобный выбор, поскольку он представляет специальные проблемы в этом контексте. Оператор умножения матриц %*%, и внешний оператор матрицы произведения %o% являются другими примерами бинарных операторов, определенных таким образом.