Kapitel 5. Generera R-kod från inställningar i det grafiska användargränssnittet

Använda JavaScript i RKWard-insticksprogram

Nu har vi definierat ett grafiskt användargränssnitt, men vi måste fortfarande skapa R-kod från det. För att göra det behöver vi en textfil till, code.js, placerad i samma katalog som description.xml. Du kanske eller kanske inte är bekant med JavaScript (eller, för att vara tekniskt precis: ECMA-script). Dokumentation om JS finns i överflöd, både på tryckt form och på Internet (t.ex. https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide). Men för de flesta syften behöver du inte kunna så mycket om JS alls, eftersom vi bara använder några mycket grundläggande funktioner.

Tips

Ta också en titt på paketet rkwarddev efter att ha läst det här kapitlet. Det tillhandahåller några R-funktioner för att skapa JavaScript-kod som ofta används i RKWard. Det kan också automatiskt detektera variabler som används i ett insticksprograms XML-fil och skapa grundläggande JavaScript-kod från det som en startpunkt för dig.

Notera

Insticksprogrammets .js-filer antas vara kodade med UTF-8. Var noga med att kontrollera editorns kodning, om du använder några tecken som inte är ASCII.

För tvåvariablers t-testen, ser filen code.js ut som följer (med kommentarer emellan):

preprocess()

function preprocess () {
}
                

JS-filen är organiserad i tre separata funktioner: preprocess(), calculate() och printout(). Det beror på att all kod inte behövs i alla steg. För närvarande används inte funktionen preprocess på många ställen (typiskt utelämnas den helt och hållet).

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');
}
                

Funktionen skapar själva R-syntaxen som körs från inställningarna i det grafiska användargränssnittet. Låt oss ta en titt på den i detalj: Koden att använda skapas med satsen echo(). Vid en närmare titt på satsen echo() steg för steg, är den första delen

res <- t.test (
                

som enkel text. Därefter måste vi fylla i värdet som användaren valde som första variabel. Vi hämtar det genom att använda getString("x") och lägger till det i strängen som ska ekas. Det skriver ut värdet på elementet i det grafiska användargränssnittet med id="x": vår första kryssruta, <checkbox>. Därefter lägger vi till ',', och gör samma sak för att hämta värdet av elementet "y", den andra kryssrutan <checkbox>. För hypotesen (gruppen <radio>) och kryssrutorna med varianserna, <checkbox>, är proceduren nästan likadan.

Observera att istället för att sammanfoga de utskrivna delarna med +, kan också flera olika echo() satser användas. Allt skrivs ut på en enda rad. För att skapa en ny rad i den skapade koden, infoga "\n" i strängen som ekas. Teoretiskt sett kan du till och med skapa många rader med en enda ekosats, men håll den helst till en rad (eller mindre) skapad god per echo().

Notera

Förutom getString() finns också funktionerna getBoolean(), som försöker returnera ett logiskt värde (lämpligt för användning i en villkorssats, if()), och getList(), som försöker returnera data som liknar listan i en JS Array(). Vi visar exempel på dem senare.

Om du tittar på befintliga insticksprogram finner du också många som använder getValue() istället för getString(), och i själva verket är de två nästan identiska. Dock är rekommenderad användning sedan version 0.6.1 att använda getString(), getBoolean() och getList().

Det blir lite krångligare för konfidensnivån. Av estetiska skäl vill vi inte explicit ange konfidensnivån som ska användas, om den motsvarar förvalt värde. Sålunda lagrar vi den först till en variabel istället för att ovillkorligt skriva ut värdet. Därefter kontrollerar vi om variabeln skiljer sig från "0.95" och i så fall skriver vi ut ett ytterligare argument. Till sist ekar vi en avslutande parentes och en ny rad: ")\n". Det är allt i funktionen calculate.

printout()

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

Och det är allt i funktionen printout i de flesta fall. rk.header() skriver ut en standardrubrik för resultaten. Observera att alla översättningsbara strängar måste markeras för hand i .js-filen, genom att använda i18n() eller några alternativa kommandon. Mer om detta i kapitlet om internationalisering. Du kan också lägga till en del ytterligare information här, om du vill, exempelvis:

function printout () {
        new Header (i18n ("Two Variable t-Test"))
                  .addFromUI ("varequal")
                  .add (i18n ("Confidence level"), getString ("conflevel"))  // Observera: skrivet såhär i illustrationssyfte. Mer automatiskt:
        //        .addFromUI ("conflevel")
                  .print ();
echo ('rk.print (res)\n');
}
                

rk.print() utnyttjar paketet R2HTML för att tillhandahålla utmatning formaterad med HTML. En annan hjälpsam funktion är rk.results(), som också kan skriva ut olika sorters resultattabeller. Om du dock tvekar, använd bara rk.print(), så är du klar. JS-klassen Header är en hjälpklass på JS-nivå för att skapa ett anrop till rk.header() (ta bara en titt på den genererade R-koden). I vissa fall kan du behöva anropa echo ('rk.header (...)') direkt för att skriva ut en rubrik för utmatningen.

Observera att internt är utmatningen för närvarande bara ett enkelt HTML-dokument. Därför kan du bli frestad att lägga till egen HTML genom att använda rk.cat.output(). Även om det fungerar, gör helst inte det. Utdataformatet kan ändras i framtiden (t.ex. till ODF), så det är bäst att inte introducera HTML-specifik kod. Behåll hellre allt enkelt med rk.header(), rk.print(), rk.results(), och vid behov rk.print.literal(). Om det inte verkar uppfylla dina formateringsbehov, kontakta oss på e-postlistan för att få hjälp.

Gratulerar! Du har skapat ditt första insticksprogram. Läs vidare i nästa kapitel om mer avancerade begrepp.