V nekaterih primerih boste morda želeli pridobiti dodatne informacije iz R, ki bodo predstavljene v uporabniškem vmesniku vašega vtičnika. Na primer, morda boste želeli ponuditi izbor ravni faktorja, ki ga je uporabnik izbral za analizo. Od različice 0.6.2 RKWard to je mogoče storiti. Preden začnemo, je pomembno, da se zavedate nekaterih opozoril:
Koda R, ki se izvaja znotraj logike uporabniškega vmesnika vtičnika, se ovrednoti v zanki dogodkov R, kar pomeni, da se lahko izvaja medtem, ko se izvajajo drugi izračuni. S tem zagotovimo, da bo uporabniški vmesnik vašega vtičnika uporaben, tudi ko R je zaposlen z drugimi stvarmi. Vendar je zaradi tega zelo pomembno, da vaša koda nima stranskih učinkov. Še posebej:
Ne izvaja nobenih dodelitev v .GlobalEnv ali katerem koli drugem nelokalnem okolju.
Ne natisne ničesar v izhodno datoteko.
Ne riše ničesar na zaslon.
Na splošno ne počne ničesar, kar ima stranske učinke. Vaša koda lahko bere informacije, ne pa "naredi" česar koli.
S tem v mislih je tukaj splošni vzorec. To boste uporabili v razdelku skriptirane logike uporabniškega vmesnika:
<script><![CDATA[
last_command_id = -1;
gui.addChangeCommand ("variable", "update ()");
update = function () {
gui.setValue ("selector.enabled", 0);
variable = gui.getValue ("variable");
if (variable == "") return;
last_command_id = doRCommand ('levels (' + variable + ')', "commandFinished");
}
commandFinished = function (result, id) {
if (id != last_command_id) return; // another result is about to arrive
if (typeof (result) == "undefined") {
gui.setListValue ("selector.available", Array ("ERROR"));
return;
}
gui.setValue ("selector.enabled", 1);
gui.setListValue ("selector.available", result);
}
]]></script>
Tu je variable lastnost, ki vsebuje ime predmeta (npr. znotraj <varslot>). Kadarkoli se to spremeni, boste želeli posodobiti prikaz ravni znotraj <valueselector>, imenovanega selector. Ključna funkcija tukaj je doRCommand(), ki kot prvi parameter vzame ukazni niz, ki ga je treba zagnati, in kot drugi parameter ime funkcije, ki jo je treba poklicati, ko je ukaz končan. Upoštevajte, da se ukaz izvaja asinhrono, zaradi česar so stvari nekoliko bolj zapletene. Kot eno stvar se želite prepričati, da vaš <valueselector> ostane onemogočen, medtem ko ne vsebuje posodobljenih informacij. Druga stvar je, da ste morda v čakalno vrsto postavili več kot en ukaz, preden dobite prve rezultate. Zato je vsakemu ukazu dodeljen "id", ki ga shranimo v last_command_id za kasnejšo uporabo.
Ko je ukaz končan, se prikliče navedeni povratni klic (commandFinished, v tem primeru) z dvema parametroma: samim rezultatom in ID-jem ustreznega ukaza. Rezultat bo vrste, ki spominja na predstavitev v R, tj. številski niz, če je rezultat številski, itd. Lahko je celo R list(), vendar bo v tem primeru predstavljen kot JS Array() brez imen.
Upoštevajte, da je tudi ta primer nekoliko poenostavljen. V resnici bi morali sprejeti dodatne previdnostne ukrepe, itd., da se izognete vstavljanju prevelikega števila stopenj v izbirnik. Dobra novica je, da vam verjetno ni treba storiti vsega tega sami. Zgornji primer je na primer vzet iz vtičnika rkward::level_select, ki ga lahko preprosto vdelate v svoj vtičnik. To vam celo omogoča, da določite drugačen izraz za izvajanje namesto levels().