Capítol 5. Generació de codi R a partir de la configuració de la IGU

Ús del JavaScript en els connectors del RKWard

Ara tenim una IGU definida, però encara necessitem generar codi R a partir d'això. Per tant, necessitem un altre fitxer de text, code.js, ubicat al mateix directori que el description.xml. Podeu estar o no familiaritzats amb el JavaScript (o, per a ser tècnicament precís: ECMA-script). La documentació sobre JS es pot trobar en abundància, tant en forma impresa, com a Internet (p. ex.: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide). Però per a la majoria de les finalitats no necessitareu saber gaire sobre JS, ja que només utilitzarem algunes característiques molt bàsiques.

Suggeriment

Després de llegir aquest capítol, també doneu un cop d'ull al paquet rkwarddev. Proporciona algunes funcions de l'R per a crear codi JavaScript utilitzat habitualment en el RKWard. També pot detectar automàticament les variables utilitzades en un fitxer XML de connector i crear codi bàsic JavaScript a partir d'aquest per a començar.

Nota

S'assumeix que els fitxers .js del connector estan codificats en UTF-8. Assegureu-vos de comprovar la codificació de l'editor, si utilitzeu qualsevol caràcter no ASCII.

Per a la prova t de dues variables, el fitxer code.js es mostra de la manera següent (amb comentaris entremig):

preprocess()

function preprocess () {
}
                

El fitxer JS està organitzat en tres funcions separades: preprocess(), calculate(), i printout(). Això es deu al fet que no es necessita tot el codi en totes les etapes. Actualment, la funció de preprocessament no s'utilitza realment en molts llocs (normalment l'ometreu).

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

Aquesta funció genera la sintaxi real de l'R que s'executarà des de la configuració de la IGU. Mirem això en detall: el codi que s'utilitza es genera utilitzant la sentència echo(). Mirant la sentència echo() pas a pas, la primera part d'aquesta és

res <- t.test (
                

com a text net. A continuació cal omplir el valor que l'usuari ha seleccionat com a primera variable. Ho obtenim utilitzant getString ("x"), i l'afegeix a la cadena per a ser «reproduït». Això mostra el valor de l'element de la IGU amb id="x": la nostra primera <checkbox>. A continuació, afegim una «, » i fem el mateix per a obtenir el valor de l'element "y", la segona <checkbox>. Per a la hipòtesi (el grup <radio>), i les variàncies iguals <checkbox>, el procediment és molt similar.

Tingueu en compte que en lloc de concatenar els fragments de sortida amb «+», també podeu utilitzar diverses sentències echo(). Tot s'imprimeix en una sola línia. Per a produir un salt de línia en el codi generat, inseriu una "\n" en la cadena reproduïda. En teoria, fins i tot podeu produir moltes línies amb una única sentència d'eco, però manteniu-la en una (o menys) línia de codi generat per echo().

Nota

A més de getString(), també hi ha funcions getBoolean(), que intentaran retornar el valor com un element binari (apropiat per a utilitzar en una sentència if()), i getList(), que intentarà retornar dades semblants a una llista en un JS Array(). Més tard mostrarem exemples d'això.

En mirar els connectors existents, també trobareu molts connectors que utilitzen getValue(), en lloc de getString(), i de fet els dos són gairebé idèntics. No obstant això, utilitzar getString(), getBoolean() i getList() és la pràctica recomanada des de la versió 0.6.1.

Es torna una mica més complicat per al nivell de confiança. Per raons d'estètica, no volem especificar explícitament el nivell de confiança a utilitzar, si correspon al valor predeterminat. Per tant, en lloc d'imprimir el valor incondicionalment, primer el recuperarem en una variable. Després comprovem si aquesta variable difereix de "0,95" i, si és així, imprimeix un argument addicional. Finalment, reproduïm un parèntesi de tancament i un salt de línia: ")\n". Això és tot per a la funció de càlcul.

printout()

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

I això era tot el que hi ha a la funció d'impressió en la majoria dels casos. rk.header() imprimeix un titular estàndard del resultat. Tingueu en compte que en els fitxers .js haureu de marcar totes les cadenes traduïbles a mà, utilitzant i18n(), o altres ordres alternatives. Més informació en el capítol sobre internacionalització. També podeu afegir més informació a això, si voleu, p. ex.:

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() utilitza el paquet R2HTML per a proporcionar una sortida amb format HTML. Una altra funció útil és rk.results(), que també pot generar tipus diferents de taules de resultats. No obstant això, si hi ha dubtes, només cal utilitzar rk.print(), i amb això és suficient. La classe JS Header és un ajudant de nivell JS per a generar una crida a rk.header() (només cal donar un cop d'ull al codi R generat). En alguns casos, és possible que vulgueu cridar echo («rk.header (...)») directament per a imprimir una capçalera per la sortida.

Tingueu en compte que internament la sortida és només un document HTML normal en aquest moment. Per tant, podeu estar temptats d'afegir HTML personalitzat utilitzant rk.cat.output(). Encara que això funcionarà, no ho feu. El format de sortida pot canviar (p. ex., a ODF) en el futur, de manera que és millor no introduir codi HTML específic. Més aviat, manteniu-ho senzill amb rk.header(), rk.print(), rk.results(), i si cal, rk.print.literal(). Si això no sembla satisfer les vostres necessitats de format, contacteu amb nosaltres a la llista de correu per a obtenir ajuda.

Felicitats! Heu creat el vostre primer connector. Llegiu en els capítols següents quant a conceptes més avançats.