Язык программирования R/Управляющие структуры
Условные операторы
[править]if()
[править]- Помощь при программировании:
> ?Control
Оператор if:
if (условие){
выполняется если условие верно
} else {
выполняется если условие не верно
}
ifelse()
[править]Команда ifelse() воспринимает первый аргумент как условие, второй аргумент возвращается если условие верно, а третий аргумент - если нет. Таким образом условие может быть вектором. Например, мы генерируем последовательность от 1 до 10 и хотим вывести значения меньше чем 5 и больше чем 8.
> x <- 1:10 > ifelse(x<5 | x>8, x, 0) [1] 1 2 3 4 0 0 0 0 9 10
Циклы
[править]R позволяет реализовать циклы тремя путями:
- циклы "for";
- циклы с предусловием ("while");
- "бесконечные" циклы ("repeat");
Циклы "for"
[править]Для использования оператора for требуется указать индекс (в примере - k) и вектор (в примере - 1:5), а также указать выполняемую конструкцию и указать повторяемые операторы в фигурных скобках. Механизм работы следующий:
- интерпретатор последовательно выбирает значения из вектора и присваивает их переменной
k; - с каждым значением
kвыполняется список функций в фигурных скобках.
> for (k in 1:5){
+ print(k)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
Циклы с предусловием ("while")
[править]Синтаксис цикла while вполне стандартен:
- Ключевое слово
while. - Условие выполнимости в скобках.
- Список функций для итерированного выполнения в фигурных скобках.
> g <- 0
> while (g < 1){
+ g <- rnorm(1)
+ cat(g,"\n")
+ }
-0.08111594
0.1732847
-0.2428368
0.3359238
-0.2080000
0.05458533
0.2627001
1.009195
"Бесконечные" циклы ("repeat")
[править]Нужно быть осторожным при использовании этого типа циклов, так как неправильное использование прерываний цикла (оператора break) может привести к бесконечному выполнению (зависанию) цикла. Синтаксис следующий:
- Ключевое слово
repeat. - Список функций для итерированного выполнения в фигурных скобках.
- Наличие условия прерывания выполнения внутри цикла.
> repeat {
+ g <- rnorm(1)
+ if (g > 1.0) break
+ cat(g,"\n")
+ }
-1.214395
0.6393124
0.05505484
-1.217408
Неявные циклы
[править]Циклы обычно медленны и лучше избегать их по возможности.
- Функция
apply()может применить функцию к элементу матрицы или массиву. Чтобы применить к строке, нужно вторым параметром отдать цифру1; чтобы применить к столбцу -2.
> N <- 10
> x1 <- rnorm(N)
> x2 <- rnorm(N) + x1 + 1
> male <- rbinom(N,1,.48)
> y <- 1 + x1 + x2 + male + rnorm(N)
> mydat <- data.frame(y,x1,x2,male)
> apply(mydat,1,mean) # применяет функцию к каждой строке
[1] 1.1654 2.8347 -0.9728 0.6512 -0.0696 3.9206 -0.2492 3.1060 2.0478 0.5116
> apply(mydat,2,mean) # применяет функцию к каждому столбцу
y x1 x2 male
3.2468 0.1415 1.2900 0.5000
- Функция
lapply()применяет функцию к каждому столбцу структуры и возвращает список.
> lapply(mydat,mean) # возвращает список $y [1] 3.247 $x1 [1] 0.1415 $x2 [1] 1.29 $male [1] 0.5
- Функция
sapply()похожа, но не возвращает ничего на экран. Могут существовать векторы или матрицы зависящие от этой функции.
> sapply(mydat,mean) # возвращает вектор
y x1 x2 male
3.2468 0.1415 1.2900 0.5000
- Функция
tapply()применяет функцию к каждому уровню factor-а.
> tapply(mydat$y,mydat$male,mean) # применяет функцию к каждому уровню factor-а.
0 1
1.040 5.454
Итераторы
[править]Циклы в R обычно медленны. Итераторы могут быть более эффективны, чем циклы. Для более подробного изучения посетите Revolution Computing Blogs (англ.).
Функции
[править]Определение функции - это присвоение блока операторов переменной. Синтаксис:
- Переменная.
- Оператор присвоения.
- Ключевое слово
function. - Список аргументов в круглых скобках.
fn=function(a) {
+ if (a) {
+ print("true");
+ } else {
+ print("false");
+ }
+ }
> fn(TRUE)
[1] "true"
> fn(F)
[1] "false"
Линковка C с R
[править]- Смотрите wikiversity Connecting Fortran and R (англ.).
- Link C with R (англ.).
