Hoofdstuk 5. Genereren van R code volgens de instellingen in de GUI

JavaScript gebruiken in plugins voor RKWard

We hebben nu een GUI gemaakt, maar moeten nu nog wat R-code hiervoor maken. Hiervoor hebben we nog een tekstbestand nodig, code.js, in dezelfde directory als de description.xml. Misschien kent u JavaScript al (of, technisch beter gezegd: ECMA-script). Documentatie voor JS is er in overvloed, zowel gedrukt, als op het Internet (bijv.: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide). Maar in de meeste gevallen hoeft u niet echt veel kennis te hebben van JS, omdat we alleen een aantal erg eenvoudige eigenschappen zullen gebruiken.

Tip

Na het lezen van dit hoofdstuk, kunt u ook kijken op rkwarddev pakket. Hierin staan enkele R-functies voor het maken van JavaScript-code die veel in RKWard wordt gebruikt. Het kan ook "autodetect" (automatisch detecteren) variabelen die in een plugin XML-bestand worden gebruikt en heel eenvoudige JavaScript-code aanmaken, voor u om me te beginnen.

Opmerking

Aangenomen wordt dat de .js-bestanden van plugins UTF-8 (een karakter-verzameling) gebruiken. Ga na of uw bewerkingsprogramma die ook gebruikt, indien u non-ascii karakters gebruikt.

Voor de t-test met twee variabelen, is het bestand code.js als volgt (met hierin commentaar):

preprocess()

function preprocess () {
}
                

Het JS-bestand is ingedeeld in drie afzonderlijke functies: preprocess(), calculate() (berekenen), en printout() (afdrukken). Dit omdat niet alle code overal nodig is. Op dit moment wordt de preprocess-functie op veel plaatsen niet echt gebruikt (eigenlijk kan u die geheel weggelaten).

calculate()

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

Deze functie genereert de actuele syntaxis in R die vanuit de GUI moet worden gestart. Bekijken we die eens nauwkeurig: De te gebruiken code wordt gegenereerd met de statement echo(). Als we de statement echo() stap voor stap bekijken, is het eerste deel:

res <- t.test (
                

als leesbare tekst. Vervolgens moeten we de waarde invullen, van de variabele die de gebruiker als eerste selecteerde. We halen die op met getString ("x"), en plakken die aan de string die moet worden ge-echo'd. Dit geeft de waarde van het GUI-element met de id="x": onze eerste <checkbox>. Vervolgens voegen we een', ' toe, en halen op dezelfde manier de waarde op van het element "y" - de tweede <checkbox>. Voor de hypothese (de <radio> groep), en de gelijke varianties <checkbox>, is de werkwijze in grote lijnen dezelfde.

Merk op dat u, in plaats van de uitvoer-stukjes met + aan elkaar plakt, u ook een aantal aparte echo() statements kunt gebruiken. Alles wordt op een enkele regel weergegeven. U kunt meerdere regels gebruiken door in de ge-echode string een "\n" (nieuwe regel) op te nemen. In theorie kunt met een echo-statement vele regels genereren, maar houdt u het alstublieft eenvoudig en beperk u tot slechts een (of minder) regels per echo().

Opmerking

Behalve getString(), zijn er functies getBoolean(), die een logische waarde probeert terug te geven (bruikbaar in een if()-statement), en getList(), die gegevens probeert terug te geven in een soort listin een JS-Array(). Later zien we hier wat voorbeelden van.

Bij het beschouwen van bestaande plugins, ziet u dat in veel pluginsgetValue() wordt gebruikt, in plaats van getString(), en in feite zijn zij bijna identiek. Maar getString(), getBoolean() en getList() gebruiken wordt aanbevolen vanaf versie 0.6.1.

Voor de confidence level (de betrouwbaarheid) is het net wat lastiger. Vanwege de esthetica, willen we niet expliciet opgeven welk niveau we willen, als het met de standaardwaarde overeenkomt. Daarom, in plaats van de waarde zonder meer weer te geven, halen we die eerst op in een variabele. Daarna controleren we of die verschilt van "0.95" , en als dat zo is geven we een extra argument weer. Tenslotte, echo-en we een a afsluithaakje en een einde regel: ")\n". Dat is alles wat de calculate (bereken) functie betref.

printout()

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

En dit is alles voor de printout (weergave) functie in de meeste gevallen. rk.header() drukt een standaard kopregel af voor de resultaten. Merk op dat in de .js-bestanden, u alle vertaalbare strings met de handmoet markeren, met de opdracht i18n(), of andere. Hierover meer in het hoofdstuk over internationalisatie. U kunt, als u dit wilt, hieraan ook wat informatie toevoegen, bijv.:

function printout () {
        new Header (i18n ("Twee variabelen t-Test"))
                  .addFromUI ("varequal")
                  .add (i18n ("Vertrouwensniveau"), getString ("conflevel"))  // Merk op: zo geschreven als illustratie. Meer automatisch:
        //        .addFromUI ("conflevel")
                  .print ();
echo ('rk.print (res)\n');
}
                

rk.print() gebruikt het R2HTML-pakket voor HTML- geformatteerde uitvoer. Nog een nuttige functie is rk.results(), die ook verschillende soorten tabellen kan uitvoeren. Maar bij twijfel gebruikt u gewoon rk.print(), en klaar is Kees. De JS class Header is een hulpfunctie in JS die rk.header() gebruikt (kijk maar naar de gegenereerde R-code). Soms kunt u de functie echo ('rk.header (...)') direct aanroepen om een koptekst bij uw uitvoer af te drukken.

Merk op dat, tot dusver, intern de uitvoer gewoon een kaal HTML-document is. U kunt daarom in de verleiding komen om eigen HTML toe te voegen met rk.cat.output(). Dit werkt, maar doe dit liever niet. Het uitvoerformaat kan in de toekomst veranderen (bijv. naar ODF),dus is het beter geen HTML-specifieke code toe te voegen. Beter kunt u een en ander eenvoudig houden, met rk.header(), rk.print(), rk.results(), en -- wanneer nodig -- rk.print.literal(). Als dit niet genoeg is, en u meer nodig heeft, neem dan contact met ons op op de mailing list, voor hulp.

Gefeliciteerd! U heeft uw eerste plugin gemaakt. Lees verder in de volgende hoofdstukken voor meer gevorderde onderwerpen.