Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Завдання 2 (Роман Васильович).docx
Скачиваний:
8
Добавлен:
08.10.2015
Размер:
73.84 Кб
Скачать
  1. Написание собственных функций

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

Нужно подчеркнуть, что большинство функций, предоставленных как часть системы R, таких как mean(), var(), postscript() и так далее, сами написаны на R и, таким образом, существенно не отличается от написанных пользователем функций. Функция определена присвоением вида:

> name <- function(arg_1, arg_2, ...) expression

expression это выражение R, (обычное групповое выражение), которое использует параметры arg_i для вычисления значения. Значение выражения – это значение, возвращаемое функцией.

Обычно в этом случае вызов функции затем обычно берет имя формулы name(expr_1, expr_2...) и может выполняться везде, где допустим вызов функции.

    1. Простые примеры

Как первый пример, рассмотрим функцию, вычисляющую 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() немного парадоксальным способом для выполнения своей части вычислений. Следовательно, существует, вероятно, некоторый смысл в простом выделении только этой части для использования функции в частом употреблении. Если так, то можно сделать это матричным бинарным оператором для более удобного использования.

    1. Определение новых бинарных операторов

Если дать функции bslash() другое имя, а именно одной из форм: %anything%

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

> "%!%" <- function(X, y) { ... }

Заметим использование двойных кавычек. Затем функцию можно использовать как X%!%y. Символ самой наклонной черты влево не удобный выбор, поскольку он представляет специальные проблемы в этом контексте. Оператор умножения матриц %*%, и внешний оператор матрицы произведения %o% являются другими примерами бинарных операторов, определенных таким образом.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]