|
|||
БІОСИСТЕМИ. БІОСФЕРА
ЕКОСИСТЕМИ. ПОПУЛЯЦІЇ
ОРГАНІЗМИ У ДОВКІЛЛІ
ЛЮДСТВО ТА ЙОГО ДОЛЯ
|
|||
← VI-23. (доповнення) Механізми поведінки людини та інших тварин |
VII-1. Перші кроки в використанні RStudio |
VII розділ (додатковий). Імітаційне моделювання на мові R в курсі екології
VII-1. Перші кроки в використанні RStudio
Я почув — я забув.
Я побачив — я запам'ятав.
Я зробив — я зрозумів.
(Приписується Конфуцію)
VII-1.1. Мова R
Історія R почалася з мови S, яку розробила Лабораторія Белла, Bell Labs — американська компанія, яка зіграла ключову роль у розвитку програмного забезпечення. Це була мова, призначена для статистичних розрахунків (це пояснення літери S), яку назвали за аналогією з мовою програмування C. З часом з'явилася й версія S+. І S, і S+ були платними і достатньо дорогими продуктами. З часом на цю мову звернули увагу активісти проєкту GNU. Проєкт GNU (GNU’s Not UNIX) було почато 1983 року Річардом Столменом. Цей американський програміст звільнився з університету для того, щоб операційна система, подібна на систему Unix (модульну операційну систему, засновану на ідеях, що були розроблені в Bell Labs), не належала жодній організації. Ініціатива Столмена привела до появи руху розробників вільного програмного забезпечення. У 1991 році Лінус Торвальдс почав роботу над ядром версії операційної системи, що була названа Linux. І Linux, і інші вільні програмні продукти, є, на наш погляд, найяскравішими прикладами здобутків людської кооперації.
Природно, що з часом два активісти GNU вирішили зробити у межах цього проєкту вільний аналог мови S+. Співробітники статистичного факультету Оклендського університету (в Новій Зеландії) Росс Іхака (Ross Ihaka) і Роберт Джентлмен (Robert Gentleman) з 1992 року розпочали роботу над розв'язанням цієї задачі. У 1993 році з'явилася перша експериментальна реалізація цієї вільної статистичної мови програмування. За аналогією з S, ця мова також отримала назву з однієї літери — першої літери імен її «батьків». З часом співтовариство R надзвичайно розрослося.
R — безкоштовний відкритий продукт. Це — мова програмування для вирішення задач в області статистики і моделювання, а також середовище з відкритим програмним кодом для обчислювань та графіки. R поширюється як програмний код, а також як відкомпільована (переведена з мови програмування на мову комп'ютерних кодів) програма. R є доступним під Linux («спорідненою» операційною системою, іншим результатом розвитку підходів Bell Labs у проєкті GNU), Windows та macOS. Загалом, ця мова — масштабний результат альтруїстичної діяльності величезної спільноти інтелектуалів усієї земної кулі, з особливою роллю представників новозеландської статистичної школи. Центром, навколо якого організована ця спільнота, є сайт r-project.org. З часом у R-співтоваристві поширюються популярні новації. Так, можна працювати з «голим» R, а можна використовувати ті або інші оболонки. Найпоширеніша оболонка для R — RStudio. Науковий керівник RStudio, професор статистики в Оклендському університеті (і біолог за першою освітою) Хедлі Уікем (Hadley Wickham) суттєво вплинув на розвиток мови R. Так, він є автором концепції tidy data та низки популярних пакетів, що входять у склад комплексу tidyverse. Найпопулярнішим з цих пакетів є ggplot2, що, фактично, став одним з стандартів наукової графіки. Концепція tidy data не є принципово новою; багато з її компонентів є відомими дуже давно (наприклад, підхід «спостереження в рядках, характеристики чи ознаки — в стовпцях» та багато інших вимог, які, крім іншого, викладені у «каноні побудови таблиці для збору первинних даних»). Втім, її інтеграція у практику рутинних обчислень в R є важливою справою.
Для нашого курсу «батьками-засновниками» можна вважати усіх трьох перелічених персон (рис. VII-1.1), адже ми будемо використовувати R через оболонку RStudio та можемо застосувати частини комплексу tidyverse.
Рис. VII-1.1. «Гуру» R: Росс Іхака та Роберт Джентлмен (джерело), Хедлі Уікем (джерело)
R — це високорівнева об'єктна інтерпретована сценарна мова програмування. Високорівневість цієї мови пов'язана з тим, що її конструкції орієнтовані на людський мозок, а не на комп'ютерний процесор (втім, цей мозок має працювати логічно, послідовно та однозначно). Мова R є об'єктною, тому що вона містить описи окремих об'єктів, що мають певні атрибути. Об'єкти можуть належати до двох категорій: data objects, що призначені для зберігання даних, та function objects, що виконують певні перетворення інших об'єктів. Об'єкт, з яким працювала функція, сам по собі не змінюється; щоб зберігти результати роботи функції, слід перетворити ці результати на новий об'єкт або окремою командою замінити старий об'єкт на новий. Щоб зрозуміти перевагу інтерпретованості R, слід зазначити, що мови програмування можуть бути компільованими та інтерпретованими. Програми компільованих мов «перекладаються» на мову кодів, що керують процесором, як єдине ціле. Програми інтерпретованих мов порядково перетворюються у коди з використанням певного інтерпретатора, «перекладача». Для сценарних мов є характерним використання певних послідовностей дій, що використовують наявні об'єкти та функції. Завдяки тому, що R є інтерпретованою сценарною мовою, програму, що написана в R, — скрипт (ланцюг команд) — можна виконувати покроково або частково. Це дуже зручно для налагодження такої програми у випадку, коли щось не заладилося з першої спроби (тобто — у типовому випадку). Скрипт R може бути змінений в будь-якому місці. Щоб повторити раніше виконану послідовність операцій в R, досить змінити скрипт і запустити його заново.
Чи є задачі, які можна вирішувати за допомогою R, унікальними для цієї мови? Ні. Ті ж самі результати можна отримати з застосуванням різних мов. Так, альтернативою R може бути Python — інша вільна мова програмування. Але слід зрозуміти, що Python має більш широке поле для використання (і завдяки цьому є більш популярним), але менш зучним для вирішення типових для R задач. Протягом тривалого часу R лишається «чемпіоном» зі зручності, потужності, гнучкості у вирішенні певної категорії задач. Ті задачі, які ми будемо розглядати в даному підгучнику, належать до цієї категорії.
Подобається це або ні, щоб використовувати R, слід подолати певний поріг входження. Типовою є ситуація, коли людина, яка не мала до цього R-досвіду (і, ще гірше, яка мала досвід роботи з принципово по-іншому організованими програмами) намагається розв'язати якусь задачу в R. На перших кроках нічого не буде зрозуміло! Ігровий підхід, що потребує інтуїтивно прозорої логіки роботи, не спрацьовує у програмному середовищі, яке вимагає однозначності. Досить часто це призводить до розчарування у R та повернення до менш досконалих інструментів. З іншого боку, маючи справу з фахівцем, що користується цією мовою, можна зробити висновок, що він вміє долати перешкоди і за необхідності може впоратися з власною фрустрацією.
Слід зазначити, що типова робота з R може складатися з покрокового подолання труднощів: щось треба зробити; шукаєш інформацію, робиш спроби, зазнаєш невдач, шукаєш їх причини, долаєш їх крок за кроком, оптимізуєш скрипт, виправляєш помилки, потрапляєш у тупик, знаходиш з нього вихід... і, кінець-кінцем, отримуєш задоволення від вирішення задачі.
...один з авторів цього посібника проходив стажування в одному з найкращих світових університетів у фахівця, що дуже просунувся у застосуванні R. Стажеру хотілося використовувати час майстра з максимальною ефективністю. За кілька днів до предметної зустрічі стажер спробував вирішити задачу самостійно і відразу стикнувся з проблемами. Очевидно, що потрібні перетворення можна зробити, але як? Інтуїтивно зрозумілі шляхи призводять до зупинок програми та появи дивних повідомлень... Стажеру не хотілося витрачати час спільної роботи на те, що можна знайти у мережі. Він шукав рішення аналогічних проблем у Google, знаходив аналогії, пробував їх застосувати та раз за разом зазнавав поразки. У такій ситуації важко не виляатися вголос; зрозуміло, що ані R, ані автори порад, які не вдалося застосувати, ні в чому не винні, але ж лайка якось полегшує відчуття невдачі... Втім, витративши кілька годин на пошук та безплідні спроби, кінець-кінцем вдавалося просунутися на один крок. До першої спільної сесії з метром вдалося зробити кілька таких кроків. І ось настав час, коли стажер пояснив, у чому йому потрібна допомога. «Гадки не маю, як це треба робити», сказав гуру: «Треба шукати». Фахівець поліз у Google; слід зазначити, що він формулював запити так, що швидше отримував результат. Перші спроби застосувати знайдене були невдалими; метр отримував повідомлення про помилки від R та лаявся у відповідь. Оскільки і метр, і стажер належали до однієї культури, лайка, яку вони використовували у разі невдачи, була більш-менш подібною... Втім достатньо швидко гуру зміг зробити потрібний крок, потім — ще один. Кваліфікація фахівця проявилася не в тому, що він знав відповідь на нетривіальні питання заздалегідь (і навіть не в тому, що він лаявся більш ефективно), а в тому, що шляхом проб та помилок із використанням колективної мудрості мережі він просувався набагато швидше, ніж новачок. Кінець-кінцем, модель, яка створювалася у тому стажуванні, була готова. Відразу стало зрозумілим, що вона не є оптимальною; скрипт довелося відкоригувати. Під час експериментів з моделлю виявилося, що одне з припущень, прийнятих під час її побудови, було невдалим; модель довелося переписати... Шановні студенти! Якщо під час роботи з R ви відчуєте себе дурнями, а R у певний момент буде здаватися способом знущання над вами, не переймайтеся: це типові переживання. Важливо, щоб вони вас не зупинили. Якщо ваші зусилля триватимуть, ви переможете, і завдяки витраченим зусиллям відчуття вашої перемоги стане особливо гострим.
VII-1.2. Інсталяція R та RStudio
В цьому розділі буде використано можливості для імітаційного моделювання, що надає мова R. Для роботи з цією мовою ми будемо використовувати програму-«оболонку» RStudio. Найпростіший спосіб їх використовувати — інсталювати їх на свій комп'ютер. Спочатку слід інсталювати R, і лише потім — RStudio. Інсталятор R вільно доступний тут, інсталятор RStudio — тут. Оберіть версії, що призначені для вашої операційної системи!
У разі, наприклад, якщо ви працюєте на пристрої (смартфоні, планшеті) під Android, вам доведеться використовувати онлайн-сервіс, наприклад, цей (рис. VII-1.2).
Рис. VII-1.2. Сервіс Posit cloud пропонує хмарний доступ до R та RStudio. Ви можете зареєструватися тут та обрати вільний доступ (що має суттєві обмеження). На жаль, таке рішення з багатьох поглядів є не самим зручним
Далі ми будемо ілюструвати викладення на прикладі інстальованого RStudio.
VII-1.3. Вікна RStudio
Після того, як інсталятор RStudio закінчить свою роботу, він, скоріше за все, нічого не запустить. Вам самим знадобиться знайти цю програму чи то в меню «Пуск», чи то серед переліку інстальованих програм. Запускайте! Якщо ви усе зробили правильно (ви ж не забули, що RStudio треба було встановлювати після R?), то ви побачите ось що (рис. VII-1.3).
Рис. VII-1.3. RStudio тільки-но викликано вперше
На рис. VII-01.3 ви бачите, що вікно RStudio розділене на окремі частини. Ще одна частина відсутня. Викличемо її. Оберіть меню File, там — New File, а далі — R Script. Тепер вікно RStudio розділене на чотири частини (рис. VII-1.4).
Рис. VII-1.4. Викликано редактор скриптів
Як сказано вище, R — скриптова мова, тобто R-програма є скриптом, ланцюгом команд, які можна виконувати повністю або частково, у будь-які місця якого можна вносити зміни. На рис. VII-1.4 ми бачимо редактор скриптів; він розташований у лівій верхній частині вікна RStudio, і в ньому відкрито скрипт Untitled1 (адже його ще не збережено). Введемо в цей редактор якусь команду, наприклад, наберемо «2*2».
Тепер ми можемо виконати цю команду. Для виконання окремого рядка скрипта ми маємо помістити курсор в цей рядок і натиснути або кнопку Run, або натиснути водночас дві клавіши на клавіатурі: Ctrl+Enter (рис. VII-1.5).
Заразу зазначимо ще два способи запускати команди R. Можна виділити курсором певну кількість рядків, і натиснути Run. Крім того, коли скрипт вже збережено (про це — дещо пізніше), можна натиснути кнопку Source; у такому разі R ще раз збереже файл зі скриптом та виконає його повністю.
Рис. VII-1.5. Один зі способів виконати команду, що міститься у рядку скрипта — поставити курсор в цей рядок рядок (або виділити його) і натиснути кнопку Run
Команду виконано (рис. VII-1.6). У консолі (лівій нижній частині екрану RStudio) з'явився результат. Спочатку консоль показує команду, яку виконував R; цю команду наведено після символу >. Далі йде рядок з результатами. Елементи цього рядка пронумеровані; номер того, що починає рядок, вказується у квадратних дужках. Оскільки рядок з відповіддю на команду «2*2» складається з одного елемента, цей номер ми й бачимо у консолі перед результатом.
Чому ця частина екрану RStudio має назву консолі? Колись, у епоху великих обчислювальних машин, пристрої для вводу та виводу даних розміщували на особих опорах або кронштейнах. В архітектурі консоллю називають опору, один з кінців якої закріплений, а іншій — вільний. З того часу консоллю у програмуванні називають пристрій (фізичний або програмний) для вводу-виводу даних.
До речі, команду «2*2» чи будь яку іншу можна було відразу ввести і в консолі — спробуйте це зробити. Втім, для створення програм (а імітаційна моделі на R є саме програмою), треба використовувати скрипти. Звикайте вводити команди у редакторі скриптів!
Ускладнимо задачу. Створимо певний об'єкт і присвоємо йому певне значення. Наберіть у редакторі скриптів «vect <- 1:10». В цій команді є три елементи. По-перше, vect — це ім'я об'єкту. Він буде створений тому, що після нього йде оператор присвоєння: <- . Якщо цей оператор використовується до об'єкту, що вже існує, він перепише його вміст. Якщо цього об'єкту ще не було, він буде створений. І третій елемент — вміст створеного об'єкту. Тут використано функцію :, яка створює послідовність цілих чисел від першого, яке вказано перед її позначенням (двокрапкою), до останнього, який вказано після двокрапки.
Цей текст призначено для першого знайомства з R, і тому тут не буде повного переліку ані типів об'єктів, що застосовуються в цій мові, ані опису типів даних, що тут можливі. Втім, зазначимо, що основним об'єктом в R є вектор — послідовність елементів. Так ось, функція : як раз і створює вектор (і саме з цим пов'язано ім'я, яке ми дали цьому об'єкту).
Використана нами команда не вимагає виводити щось у консоль, там з'явиться тільки звіт про те, яку команду було виконано. Але результат виконання (новий об'єкт) з'явився у правій верхній частині екрану RStudio — у вікні Environment, оточення. Тут перелічені об'єкти, з якими працює R під час даної сесії (рис. VII-1.6).
Рис. VII-1.6. В консолі — звіт про виконання двох команд. В Environment — створений об'єкт, вектор з цілих чисел від 1 до 10
Щоб зрозуміти, що знаходиться в правій нижній частині вікна RStudio, виконаємо команду plot(vect). Функція plot() будує графік, формат якого залежить від особливостей об'єкта, з яким вона працює. Те, що це саме функція, крім іншого, показує те, що до її назви додані дужки. В цих дужках слід вказувати атрибути — частини команди, які вказують, з чим працюватиме ця функція і як саме вона працюватиме (рис. VII-1.6). Функція :, з якою ви тільки-но познайомилися, є в цьому сенсі нетиповою, вона використовується без дужок, просто поєднуючі ті атрибути, між якими вона розташована.
Функція plot() має вивести побудувати діаграму на підставі об'єкту vect. Коли ми будемо вводити назву цього об'єкту, RStudio запропонує нам підказку у маленькому спливаючому віконці, хінті (рис. VII-1.7). Хінт з переліком пропозицій для автоматичної підстановки назв функцій або об'єктів можна викликати (починаючи набирати якесь ім'я) й спеціально; для цього слід натиснути Tab або ж Ctrl+Space.
Рис. VII-1.7. Хінт — спливаюча підказка в RStudio
Ми не вказали жодних додаткових атрибутів в команді plot(vect). Майте на увазі: в функції plot(), як ви побачите надалі, може бути дуже багато атрибутів! Поки задача, яку має виконувати ця функція, не конктеризована детальніше, вона створить найпростіший варіант діаграми, передбачений за замовчуванням. Результат буде показаний в правій нижній частині вікна RStudio, на вкладці Plots (рис. VII-1.8).
До речі, на рис. VII-1.8 показана ще одна важлива особливість R: скрипт можна коментувати. Усе, що розташовано у певному рядку після символу # («ґратки») буде проігноровано при виконанні скрипту. Це — текст, що призначено не для R, а для людини-читача. RStudio підсвічує такі коментарі зеленим кольором. Закоментувати (тобто закрити від виконання) можна як частину рядка, що буде йти після «ґратки», так і цілий рядок і навіть низку рядків. Справа в тому, що іноді, при роботі зі скриптом, буває корисним закоментувати його певну частину (наприклад, передбачити у моделі різні набори початкових параметрів, розкоментовувати потрібрий та закоментовувати зайві). У таких випадках слід виділити потрібний набор рядків та натиснути Ctrl+Shift+C. Така команда закоментує розкоментовані рядки та розкоментує закоментовані.
Рис. VII-1.8. На вкладці Plots з'явилася діаграма
Використаємо скрини RStudio, щоб показати ще одну особливість роботи з цією програмою. При збереженні скрипту, де були використані символи, що відрізняються від типового для латиниці набору, RStudio попросить визначити, яку кодову сторінку (відповідність між кодами, що зберігаються у файлі, та символами) слід використовувати. Рис. VII-1.9 створено в Ubuntu, одній з версій операційної системи Linux; в цій системі за замовченням використовується кодова сторінка UTF-8.
Рис. VII-1.9. Вибір кодової сторінки при збереженні скрипта
До цього моменту ми використовували дуже неекономний спосіб демонстрації того, як працює R — наводили скрини. Далі ми будемо використовувати більш досконалий спосіб і користуватимемося засобами мови розмітки тексту R Markdown.