Consultar l'R per a obtenir informació

En alguns casos, és possible que vulgueu obtenir més informació de l'R, que es presentarà a la interfície d'usuari del vostre connector. Per exemple, podeu oferir una selecció dels nivells d'un factor que l'usuari ha seleccionat per a l'anàlisi. Des de la versió 0.6.2 del RKWard és possible fer-ho. Abans de començar, és important que tingueu present algunes advertències:

El codi R que s'executa des de dins de la lògica de la interfície d'usuari del connector s'avalua en el bucle d'esdeveniments de l'R, el que significa que es poden executar mentre s'estan executant altres càlculs. Això és per a assegurar-vos que la interfície d'usuari del vostre connector es pugui utilitzar, fins i tot mentre l'R estigui ocupat fent altres coses. Tanmateix, això fa que sigui molt important que el seu codi no tingui efectes secundaris. En particular:

  • No fa cap assignació a «.GlobalEnv» o qualsevol altre entorn no local.

  • No imprimeix res al fitxer de sortida.

  • No traça res en la pantalla.

  • En general, no faci res que tingui efectes secundaris. El vostre codi pot llegir informació, no «fer» altres coses.

Amb això en ment, aquí està el patró general. Ho utilitzareu dins d'una secció lògica IU amb scripts:

<script><![CDATA[
                                let update = gui.addChangeCommand ("variable", function () {
                                        gui.setValue ("selector.enabled", 0);
                                        variable = gui.getValue ("variable");
                                        if (variable == "") return;

                                        new RCommand('levels (' + variable + ')', "myid").then(result =
> {
                                                gui.setValue ("selector.enabled", 1);
                                                gui.setListValue ("selector.available", result);
                                        }).catch(msg =
> {
                                                if (msg === "outdated") return;  // command was canceled, because new one is about to arrive -> benign
                                                // possibly other error handling, msg carries the warnings and error messages produced,
                                                // if the command failed e.g.:
                                                gui.setListValue ("selector.available", Array ("ERROR:", msg));
                                        });
                                });
                ]]></script>
        

Aquí, variable és una propietat que conté un nom d'objecte (p. ex., dins d'un <varslot>). Sempre que això canviï, voldreu actualitzar la visualització dels nivells dins del <valueselector>, anomenat selector. La funció clau aquí és new RCommand(), que pren com a primer paràmetre la cadena de l'ordre a executar. Tingueu en compte que l'ordre s'està executant asíncronament, i això fa les coses una mica més complexes. Per a una cosa que voleu estar segur, el <valueselector> roman desactivat, mentre que no contingui informació actualitzada. En segon lloc, com que l'usuari pot fer canvis ràpidament, pot haver-se generat més d'una ordre, abans de rebre cap resultat. Per tant, haureu d'assegurar-vos d'actuar només amb l'ordre més recent.

Per a tractar l'asincronisme, el que es retorna aquí és un objecte Promise. Es pot trobar més informació sobre aquesta funció javascript potent a Internet. L'important que cal saber aquí, és que l'addició d'una declaració .then() permet especificar què passarà quan l'ordre s'hagi completat, i una declaració .catch() es pot utilitzar per a gestionar qualsevol error. De nou, tingueu en compte que el bloc .then() no s'executa immediatament. Per a entendre les implicacions d'això, pot ser útil, durant el desenvolupament, inserir un Sys.sleep(1); a l'ordre R, per a veure immediatament què passa quan una ordre no es completa.

Finalment, per a tractar amb ordres diverses que s'estan generant, podeu especificar un segon argument a new RCommand(), ("myid", en aquest exemple). Qualsevol ordre amb el mateix identificador (escollit lliurement) s'entendrà que pertany a la mateixa cua. Llavors l'RKWard s'assegurarà que en realitat només l'última ordre activarà el bloc .then(), mentre que qualsevol ordre obsoleta arribarà al bloc .catch(). Aquí, es poden identificar ordres obsoletes, ja que es passa la cadena «outdated» com el seu valor, mentre que per a qualsevol altre possible error, avís o missatge d'error es passa directament.

Cal tenir en compte que aquest exemple és una mica simplificat. En realitat, haureu de prendre precaucions addicionals, p. ex., per a evitar posar una quantitat extrema de nivells al selector. La bona notícia és que probablement no cal fer tot això vós mateix. L'exemple anterior es pren del connector rkward::level_select, per exemple, que simplement podeu incrustar en el vostre propi connector. Fins i tot us permet especificar una expressió diferent per a executar en lloc de levels().

Nota

En versions anteriors del RKWard, les ordres R s'executaven utilitzant una funció una mica més complexa doRCommand(). Encara podeu veure-ho en alguns connectors, però no es recomana utilitzar-la en el codi nou.