Ос

Основи у R

1 вправа

Про концепцію Основи

Змінні та присвоєння

R - мова з динамічною типізацією, тож загалом тип змінної вказувати не потрібно. Типово використовується numeric, зазвичай реалізований як число з плаваючою комою подвійної точності. Щоб скористатися 32-бітовими цілими числами, додамо суфікс L (скорочення від Long).

Отримати «тип» обʼєкта (з історичних причин) може заплутати. Функції typeof() і class() схожі, але можуть повертати трохи різні результати:

typeof(50)
#> [1] "double"  # more specific: an implementation detail
typeof(50L)
##> [1] "integer"

class(50)
#> [1] "numeric"  # less specific: ignores implementation details
class(50L)
#> [1] "integer"
Advanced

Можна також натрапити на згадки про mode(), яка схожа на typeof().

Проігноруймо mode() і storage.mode(). Їх залишили лише для зворотної сумісності.

Для присвоєння краще використовувати оператор <-. Якщо ми працюємо в RStudio, його можна ввести комбінацією клавіш Alt-minus.

x <- 42
avogadro <- 6.02e23
mystr <- "Hello, World!"

Використання = замість <- часто, але не завжди, працює, і його не радять як поганий стиль.

Оператори здебільшого такі самі, як у багатьох інших мовах, хоча %% і %/% трапляються рідше. Синтаксис із % дає змогу викликати інфіксні оператори, реалізовані як макроси.

2 + 3   # 5
2 - 3   # -1
2 * 3   # 6
2 / 3   # 0.6666667
8 %/% 3 # 2 (integer division)
8 %% 3  # 2 (remainder)
2 ^ 3   # 8 (exponential)

У R символ # починає однорядковий коментар. Окремого синтаксису для багаторядкових коментарів немає.

Функції

Щоб визначити функцію:

squareit <- function(x) {
    x * x
}

Функція може мати нуль або більше аргументів, розділених комами. Дужки () потрібні разом із function(), навіть якщо параметрів немає.

Для аргументів функції можна вказати типові значення, але вони мають іти після всіх аргументів без типових значень, і для присвоєння типового значення використовують =, а не <-. Ось досить безглуздий приклад:

squareit <- function(x = 42) {
    x * x
}

squareit()
#> [1] 1764

Фігурні дужки { } формально не обовʼязкові для однорядкових тіл функцій, але вважається, що краще їх писати.

R автоматично повертає останнє значення функції, як у прикладах вище.

return() можна викликати будь-де в тілі функції, щоб явно вказати повернене значення. Він негайно повертає вказане значення й завершує функцію, не виконуючи решти виразів у тілі функції.

Явний виклик return() зазвичай потрібен лише тоді, коли ми хочемо достроково вийти з функції й повернути конкретне значення з якоїсь причини. Наприклад, у конструкції if-else.

Утім, дехто з розробників надає перевагу явним поверненням заради стилю коду.

Викликати функцію так само, як і в багатьох інших мовах:

squareit(3)
#> [1] 9

У наступних концепціях ми побачимо, що результат 9 насправді є вектором довжини 1, а не скалярним числом. Звідси й [1], яке показує, що це початок вектора.

is.vector(9)
#> [1] TRUE

Майже все в R так чи інакше є вектором!

Note

Консоль R покаже наведений вище приклад так:

> squareit(3)
[1] 9

Документи в цьому силабусі здебільшого дотримуються умовності, прийнятої в кількох підручниках з R: ми прибираємо запрошення й коментуємо результат. Так зразки коду легше копіювати в консоль і запускати.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Основи