Розділ 10. Концепції, якими можна скористатися у спеціалізованих додатках

У цій главі наведено відомості щодо певних тем, які є корисними лише для деяких класів додатків.

Додатки для створення графіків

Створити креслення з додатка доволі просто. Втім, існує декілька неприємних речей, які слід обійти, та деякі чудові загальні функціональні можливості, про які ви маєте знати. У цьому розділі продемонстровано базові поняття та наведено канонічний приклад, якому вам варто слідувати під час створення додатків для креслення.

Малювання у вікні виведення результатів

Для створення креслення у вікні виведення даних скористайтеся rk.graph.on() безпосередньо перед створенням креслення і rk.graph.off() одразу після його створення. Це те саме, що, наприклад, викликати postscript() і dev.off() у звичайному сеансі R.

Втім, що важливо, вам слід завжди викликати rk.graph.off() після виклику rk.graph.on(). Якщо ви цього не зробите, файл результатів залишиться незавершеним. Щоб переконатися, що rk.graph.off() буде насправді викликано, вам слід загорнути усі команди R між двома викликами у інструкцію try(). Ніколи про таке не чули? Не переймайтеся, це просто. Усе, що вам слід зробити, — це дотримуватися взірця у прикладі, який наведено нижче.

Додавання функціональної можливості попереднього перегляду

Примітка

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

Дуже корисною можливістю усіх додатків для створення креслень і графіків є надання попереднього перегляду із автоматичним оновленням. Для створення такого попереднього перегляду потрібні дві речі: додати пункт з позначкою <preview> до вашого визначення графічного інтерфейсу і скоригувати створений код для отримання зображення попереднього перегляду.

Додавання пункту <preview> доволі просте. Достатньо просто розмістити відповідні теґи у описі графічного інтерфейсу. Система сама подбає про створення пристрою для попереднього перегляду, оновлення попереднього перегляду у відповідь на зміни параметрів тощо. Приклад:

Примітка

Починаючи з версії 0.6.5 RKWard елементи попереднього перегляду, <preview>, виокремлюються у діалогових вікнах додатків (не майстрів): вони розташовуються у стовпчику з кнопками, незалежно від того, де їх було визначено у описі графічного інтерфейсу. Втім, варто визначати їх у відповідному місці компонування з міркувань зворотної сумісності.

<document>
                [...]
                <dialog [...]>
                        [...]
                        <preview id="preview"/>
                        [...]
                </dialog>
                [...]
        </document>
                

І це усе, що потрібно для визначення графічного інтерфейсу.

Коригування шаблона JS потребує лише трохи більше зусиль. Тут вам потрібно забезпечити створення лише самого креслення і показ його на екранному пристрої, а не спрямовування каналом виведення даних. Тобто, не потрібен друк заголовків, не потрібне rk.graphics.on() та подібні виклики. Щоб допомогти вам у цьому, RKWard викличе функції preprocess(), calculate() і printout() з додатковим параметром, для якого встановлено значення true при створення коду для попереднього перегляду. (Цей параметр буде пропущено при створенні остаточного коду. У javascript обчисленим значенням буде false при використанні в інструкції if.) Див. наведений нижче приклад із типовим взірцем того, який код вам потрібен.

Крім того, якщо вам потрібне додаткове керування, ви можете, замість цього, додати до вашого шаблона JS нову функцію із назвою preview() і створити код, який потрібен для попереднього перегляду у ній (ймовірно, принаймні частково, знову ж таки, викликом calculate() тощо).

Загальні параметри креслення

Як можна помітити, більшість додатків для креслення у RKWard надають можливість змінювати широкий діапазон загальних параметрів креслення, наприклад, визначення підписів до осей та полів рисунка. Додати ці параметри до вашого додатка просто. Вони надаються придатним до вбудовування додатком із назвою rkward::plot_options. Вбудовування до інтерфейсу вашого додатка відбувається так:

<document>
                [...]
                <logic [...]>
                        <connect client="plotoptions.xvar" governor="x.available"/>
                        <set id="plotoptions.allow_type" to="true"/>
                        <set id="plotoptions.allow_ylim" to="true"/>
                        <set id="plotoptions.allow_xlim" to="false"/>
                        <set id="plotoptions.allow_log" to="false"/>
                        <set id="plotoptions.allow_grid" to="true"/>
                </logic>
                <dialog [...]>
                        [...]
                        <embed id="plotoptions" component="rkward::plot_options" as_button="true" label="Plot Options"/>
                        [...]
                </dialog>
                [...]
        </document>
                

Це додасть до вашого графічного інтерфейсу кнопку для виклику вікна із параметрами креслення. Розділ логіки наведено лише для прикладу. За його допомогою ви можете керувати додатком параметрів креслення. Докладніше про це на сторінці довідки до додатка plot_options (посилання на неї є на сторінці довідки будь-якого додатка, який надає доступ до загальних параметрів).

Далі, вам слід забезпечити додавання коду, що відповідає вашим параметрам креслення, до коду, який створюється додатком для креслення. Для цього отримуємо властивості code.preprocess, code.printout і code.calculate з вбудованого додатка параметрів креслення і вставляємо їх до нашого коду так, яке це показано у наведеному нижче прикладі.

Канонічний приклад

Ось приклад файла .JS, яким ви можете скористатися як шаблоном, коли ви захочете створити додаток для креслення:

function preprocess () {
    // «somepackage» потрібен для створення креслення
    echo ("require (somepackage)\n");
  }
  
  function printout (is_preview) {
    // Якщо «is_preview» має значення false/не визначено, буде створено код повністю, разом із заголовками.
    // Якщо «is_preview» має значення true, буде створено лише основні елементи.

    if (!is_preview) {
      echo ('rk.header (' + i18n ("An example plot") + ')\n\n');
      echo ('rk.graph.on ()\n');
    }
    // Для is_preview==true буде створено лише наведений нижче розділ

    // пам’ятайте: усе між rk.graph.on() і rk.graph.off() слід загортати у інструкцію try():
    echo ('try ({\n');
    // вставте будь-який код зі встановлення параметрів, який має бути запущено до безпосередніх команд створення креслення.
    // Сам код буде створено вбудованим додатком параметрів креслення. printIndentedUnlessEmpty() забезпечить належне форматування.
    printIndentedUnlessEmpty ('\t', getString ("plotoptions.code.preprocess"), '', '\n');

    // створити саме креслення. plotoptions.code.printout забезпечує роботу частини загальних параметрів креслення,
    // які має бути додано до самого виклику функції креслення.
    echo ('plot (5, 5' + getString ("plotoptions.code.printout") + ')\n');

    // вставте тут будь-який код встановлення параметрів, який має бути виконано після креслення.
    printIndentedUnlessEmpty ('\t', getString ("plotoptions.code.calculate"), '\n');
    echo ('})'\n);  // завершуємо інструкцію try()

    if (!is_preview) {
      echo ('rk.graph.off ()\n');
    }
  }