Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
RCoreTeam2014.docx
Скачиваний:
46
Добавлен:
08.10.2015
Размер:
539.13 Кб
Скачать
  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%являются другими примерами бинарных операторов, определенных таким образом.

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