Язык программирования R/Управляющие структуры

Условные операторы

править
  • Помощь при программировании:
> ?Control

Оператор if:

if (условие){
     выполняется если условие верно
} else {
     выполняется если условие не верно
}

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

  1. интерпретатор последовательно выбирает значения из вектора и присваивает их переменной k;
  2. с каждым значением k выполняется список функций в фигурных скобках.
> for (k in 1:5){
+ print(k)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

Циклы с предусловием ("while")

править

Синтаксис цикла while вполне стандартен:

  1. Ключевое слово while.
  2. Условие выполнимости в скобках.
  3. Список функций для итерированного выполнения в фигурных скобках.
> 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) может привести к бесконечному выполнению (зависанию) цикла. Синтаксис следующий:

  1. Ключевое слово repeat.
  2. Список функций для итерированного выполнения в фигурных скобках.
  3. Наличие условия прерывания выполнения внутри цикла.
> 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(англ.).

Функции

править

Определение функции - это присвоение блока операторов переменной. Синтаксис:

  1. Переменная.
  2. Оператор присвоения.
  3. Ключевое слово function.
  4. Список аргументов в круглых скобках.
fn=function(a) {
+     if (a) {
+         print("true");
+     } else {
+         print("false");
+     }
+ }
> fn(TRUE)
[1] "true"
> fn(F)
[1] "false"

Линковка C с R

править

Ссылки

править