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"
Можна також натрапити на згадки про 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 так чи інакше є вектором!
Консоль R покаже наведений вище приклад так:
> squareit(3)
[1] 9
Документи в цьому силабусі здебільшого дотримуються умовності, прийнятої в кількох підручниках з R: ми прибираємо запрошення й коментуємо результат. Так зразки коду легше копіювати в консоль і запускати.