Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Звіт попитка 2.docx
Скачиваний:
1
Добавлен:
08.10.2015
Размер:
62.62 Кб
Скачать

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)

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