Розділ 5. Створення коду R на основі параметрів графічного інтерфейсу

Використання JavaScript у додатках RKWard

Тепер, коли ми визначили графічний інтерфейс, слід попрацювати над створенням на його основі певного коду R. Для цього нам знадобиться ще один текстовий файл, code.js, який зберігатиметься у тому самому каталозі, що і description.xml. Ви можете бути знайомі з програмуванням JavaScript (або, якщо бути зовсім точним, ECMA-script) чи нічого не знайти про цю мову програмування. Документації щодо JS вдосталь, як у друкованій формі, так і на сторінках інтернету (приклад: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide). Але для виконання більшості завдань вам не потрібно багато знати про JS, достатньо бути ознайомленим із дуже базовими можливостями.

Підказка

Після прочитання цього розділу ознайомтеся також із розділом щодо пакунка rkwarddev. У цьому пакунку можна знайти деякі функції R для створення коду JavaScript, який часто використовується у RKWard. Також у пакунку є засоби автоматичного виявлення змінних, які використовуються у файлі XML додатка і створення базового коду JavaScript, з якого можна розпочати роботу над кодом додатка.

Примітка

Текст файлів .js додатків має бути записано у кодуванні UTF-8. Якщо ви користуєтеся символами поза таблицею ASCII, переконайтеся, що ваш редактор використовує саме це кодування.

Для двопараметричної t-перевірки, файл code.js виглядатиме так (з проміжними коментарями):

preprocess()

function preprocess () {
}
                

Файл JS поділено між трьома окремими функціями: preprocess(), calculate() та printout(). Причиною є те, що не увесь код потрібен на усіх етапах роботи. У поточній версії функція попередньої обробки (preprocess) у більшості випадків не використовується (вам вона теж далеко не завжди буде потрібна).

calculate()

function calculate () {
        echo ('res <- t.test (x=' + getString ("x") + ', y=' + getString ("y") + ', hypothesis="' + getString ("hypothesis") + '"' + getString ("varequal"));
        var conflevel = getString ("conflevel");
        if (conflevel != "0.95") echo (', conf.level=' + conflevel);
        echo (')\n');
}
                

Ця функція виконує створення самого коду команд R, які буде виконано на основі параметрів з графічного інтерфейсу. Розгляньмо її детальніше: код, який буде використано створюється за допомогою інструкції echo(). Якщо розглянути інструкцію echo() крок за кроком, першою її частиною є

res <- t.test (
                

у форматі звичайного тексту. Далі, нам слід заповнити значення, яке вибрано користувачем як перша змінна. Ми отримуємо це значення за допомогою функції getString ("x") і дописуємо його до рядка для «трансляції». Це виводить значення елемента графічного інтерфейсу з id="x": нашого першого поля для позначки, <checkbox>. Далі, ми дописуємо «, » і робимо подібну ж операцію для отримання значення елемента "y" — другого поля для позначки, <checkbox>. Для гіпотези (група <radio>) та поля для позначки <checkbox> щодо рівних дисперсій процедура дуже схожа на описану вище.

Зауважте, що замість об’єднання фрагментів виведення за допомогою «+» ви можете скористатися декількома інструкціями echo(). Усе буде виведено у один рядок. Щоб додати символ розриву рядка у створений код, вставте "\n" наприкінці рядка. Теоретично, ви навіть можете створити багаторядкову команду за допомогою однієї інструкції echo, але варто все ж обмежуватися одним рядком (або частиною одного рядка) у створеному однією інструкцією echo() коді.

Примітка

Окрім функції getString(), передбачено функцію getBoolean(), яка намагатиметься повернути значення у логічному форматі (придатному до використання у інструкції if()), та функцію getList(), яка намагатиметься повернути спископодібні дані у Array() JS. Приклади застосування цих функцій буде наведено нижче.

У наявних додатках ви знайдете багато використань getValue() замість getString(). Фактично, ці дві функції майже ідентичні. Втім, використанню getString(), getBoolean() та getList() слід надавати перевагу, починаючи з версії 0.6.1.

Для довірчого рівня все трошки складніше. З естетичних міркувань ми не хочемо явним чином вказувати довірчий рівень, який слід використовувати, якщо він відповідає типовому значенню. Отже, замість безумовного виведення значення, нам слід спочатку отримати його до змінної. Далі, ми перевіряємо, чи відрізняється ця змінна від "0.95", і якщо це так, виводимо додатковий аргумент. Нарешті, ми виводимо завершальну дужку та символ кінця рядка, ")\n". Ось і усе у функції calculate.

printout()

function printout () {
        echo ('rk.header (' + i18n ("Two Variable t-Test") + ')\n');
        echo ('rk.print (res)\n');
}
                

Ось це і все, що може знадобитися у більшості випадків для функції printout. rk.header() виводить стандартний рядок заголовка для результатів. Зауважте, що у файлах .js вам доведеться позначити усі придатні до перекладу рядки вручну за допомогою функції i18n() або альтернативних функцій. Докладніше про це у розділі щодо інтернаціоналізації. Ви також можете додати певні відомості щодо цього, якщо потрібно, наприклад:

function printout () {
        new Header (i18n ("Two Variable t-Test"))
                  .addFromUI ("varequal")
                  .add (i18n ("Confidence level"), getString ("conflevel"))  // Note: written like this for illustration purposes. More automatic:
        //        .addFromUI ("conflevel")
                  .print ();
echo ('rk.print (res)\n');
}
                

rk.print() використовує пакунок R2HTML для створення даних у форматі HTML. Ще однією корисною функцією є rk.results(): ця функція також здатна виводити різні типи таблиць результатів. Втім, якщо ви не певні, просто скористайтеся rk.print(), — цього достатньо. Клас JS Header є допоміжним класом на рівні JS для створення викликів до rk.header() (достатньо зазирнути до створеного коду R). Іноді виникає потреба у безпосередньому виклику echo ('rk.header (...)') для виведення заголовка до ваших результатів.

Зауважте, що на внутрішньому рівні виведені дані є на цей момент часу простим документом HTML. Тому у вас може виникнути бажання додати нетиповий код HTML за допомогою rk.cat.output(). Хоча це і працюватиме, будь ласка, не робіть так. Формат виведення може бути змінено (наприклад на ODF) у майбутніх версіях, отже варто не додавати специфічного для HTML коду. Краще не ускладнювати речі і користуватися rk.header(), rk.print(), rk.results() і, якщо потрібно, rk.print.literal(). Якщо усі ці функції не задовольняють ваші потреби у форматуванні, повідомте про це розробникам RKWard за допомогою списку листування розробників.

Вітаємо! Ви створили ваш перший додаток. За допомогою наступних глав ви зможете удосконалити і розширити ваші знання.