Convencions, polítiques i coneixement general

Hi ha moltes maneres d'escriure codi R per a una determinada tasca, i hi ha encara més maneres de generar aquest codi R a partir de JS. Com ho feu exactament, és cosa vostra. Encara hi ha una sèrie de consideracions que hauríeu de seguir, i la informació de base que hauríeu d'entendre.

Entendre l'entorn local()

Amb freqüència haureu de crear un o més objectes R temporals en el codi generat pel connector. Normalment, no voleu que es col·loquin a l'espai de treball de l'usuari, fins i tot sobreescrivint les variables d'usuari. Per tant, tot el codi generat pel connector s'executa en un entorn local() (vegeu la pàgina d'ajuda de la funció local() de l'R). Això vol dir que totes les variables que creeu són temporals i no es desaran permanentment.

Si l'usuari demana explícitament que es desi una variable, haureu d'assignar a aquest objecte utilitzant .GlobalEnv$objectname <- value. En general, no utilitzeu l'operador <<. No s'assignarà necessàriament a .GlobalEnv.

Un escull important és utilitzar eval(). Aquí, haureu de tenir en compte que «eval» utilitzarà de manera predeterminada l'entorn actual per a l'avaluació, és a dir, el local. Això funcionarà bé la majoria de les vegades, però no sempre. Per tant, si necessiteu utilitzar eval(), probablement voldreu especificar el paràmetre envir: eval(..., envir=globalenv()).

Format del codi

El més important és que el codi R generat funcioni, però també hauria de ser fàcil de llegir. Per tant, vigileu també el format. Algunes consideracions:

S'han d'alinear a l'esquerra les sentències R normals de nivell superior.

Les sentències d'un bloc inferior s'han de sagnar amb una tabulació (vegeu l'exemple a continuació).

Si feu càlculs molt complexos, afegiu un comentari aquí i allà, especialment per a marcar les seccions lògiques. Tingueu en compte que hi ha una funció dedicada comment() per a inserir comentaris traduïbles en el codi generat.

Per exemple, el codi generat podria tenir aquest aspecte. El mateix codi sense sagnat o comentaris seria bastant difícil de llegir, malgrat la seva modesta complexitat:

# primer determina el balanceig i la rotació
my.wobble <- wobble (x, y)
my.rotation <- wobble.rotation (my.wobble, z)

# cal triar el mètode de balanceig segons la rotació
if (my.rotation > wobble.rotation.limit (x)) {
        method <- "foo"
        result <- boggle.foo (my.wobble, my.rotation)
} else {
        method <- "bar"
        result <- boggle.bar (my.wobble, my.rotation)
}
                

Tractament amb opcions complexes

Molts connectors poden fer més d'una cosa. Per exemple, el connector «Estadístiques descriptives» pot calcular la mitjana, l'interval, la suma, el producte, la mediana, la longitud, etc. No obstant això, normalment l'usuari només triarà fer alguns d'aquests càlculs. En aquest cas, intenteu mantenir el codi generat el més senzill possible. Només hauria de contenir porcions rellevants per a les opcions realment seleccionades. Per a aconseguir-ho, aquí hi ha un exemple d'un patró de disseny comú tal com l'utilitzaríeu (en JS; aquí, "domean", "domedian" i "dosd" serien elements de <checkbox>):

function calculate () {
        echo ('x <- <' + getString ("x") + ')\n');
        echo ('results <- list ()\n');

        if (getBoolean ("domean.state")) echo ("results$" + i18n ("Mean value") + " <- mean (x)\n");
        if (getBoolean ("domedian.state")) echo ("results$" + i18n ("Median") + " <- median (x)\n");
        if (getBoolean ("dosd.state")) echo ("results$" + i18n ("Standard deviation") + " <- sd (x)\n");
        //...
}