Kapitel 3. Skapa menyalternativ

När ett nytt insticksprogram skapas, måste RKWard få reda på det. Den första saken att göra är alltså att skriva en .pluginmap-fil (eller ändra en befintlig). Formatet för en .pluginmap är XML. Jag leder dig igenom ett exempel (försäkra dig också naturligtvis om att RKWard är inställt att läsa in din .pluginmap med InställningarAnpassa RKWardInsticksprogram):

Tips

Efter att ha läst det här kapitlet, ta också en titt på paketet rkwarddev. Det tillhandahåller några R-funktioner för att skapa de flesta av RKWards XML-taggar åt dig.

<!DOCTYPE rkpluginmap>
        

Värdet doctype tolkas egentligen inte, men ställ in det till "rkpluginmap" ändå.

<document base_prefix="" namespace="myplugins" id="mypluginmap">
        

Egenskapen base_prefix kan användas om alla insticksprogram befinner sig i en gemensam katalog. Då kan man därmed utelämna katalogen från filnamnen angivna nedan. Det är säkert att låta den vara "".

Som du kommer att märka nedan, får alla insticksprogram en unik identifierare, id. Att använda namespace är ett sätt att organisera sådana id, och göra det mindre troligt att duplicerade identifierare skapas av misstag. Internt läggs namnrymden följt av :: till före alla identifierare som anges i en .pluginmap. I allmänhet, om du avser att distribuera dina insticksprogram i ett R-paket, är det en god idé att använda paketnamnet som parametern namespace. Insticksprogram som levereras med den officiella distributionen av RKWard har namespace="rkward".

Egenskapen id är valfri, men att ange id för din .pluginmap gör det möjligt för andra att låta sina .pluginmap:ar läsa in din .pluginmap automatiskt (se avsnittet om beroenden).

<components>
        

Komponenter? Talar vi inte om insticksprogram? Ja, men i framtiden kommer insticksprogram inte vara mer än en särskild klass av komponenter. Vad vi gör här är då att registrera alla komponenter/insticksprogram med RKWard. Låt oss ta en titt på en exempelpost:

<component type="standard" id="t_test_two_vars" file="t_test_two_vars.xml" label="Two Variable t-Test" />
        

Först egenskapen type: Lämna den som "standard" för tillfället. Ytterligare typer är inte implementerade ännu. Vi har redan nämnt id. Varje komponent måste ha en unik identifierare (i sin namnrymd). Välj en som är enkel att känna igen. Undvik mellanslag och specialtecken. De är hittills inte förbjudna, men kan ha särskilda betydelser. Med egenskapen file anger man var beskrivningen av själva insticksprogrammet finns. Det är relativt till katalogen där .pluginmap-filen finns, och till base_prefix ovan. Ge till sist komponenten en beteckning. Beteckningen var än insticksprogrammet placeras i menyn (eller i framtiden kanske också på andra ställen).

Typiskt innehåller .pluginmap-filen flera komponenter, så här är några fler:

<component type="standard" id="unimplemented_test" file="means/unimplemented.xml" />
                <component type="standard" id="fictional_t_test" file="means/ttests/fictional.xml" label="This is a fictional t-test" />
                <component type="standard" id="descriptive" file="descriptive.xml" label="Descriptive Statistics" />
                <component type="standard" id="corr_matrix" file="corr_matrix.xml" label="Correlation Matrix" />
                <component type="standard" id="simple_anova" file="simple_anova.xml" label="Simple Anova" />
        </components>
        

OK, det var första steget. RKWard känner nu till att insticksprogrammen finns. Men hur aktiverar man dem? De måste läggas till i en menyhierarki:

<hierarchy>
                <menu id="analysis" label="Analysis">
        

Direkt under taggen <hierarchy> börjar man beskriva i vilken meny (<menu>) som insticksprogrammet ska finnas. Med raden ovan säger man att insticksprogrammet ska vara i menyn Analysis (inte nödvändigtvis direkt i den, utan i en undermeny). Menyn Analysis är standard i RKWard, så den behöver i själva verket inte skapas från början. Om den dock inte fanns ännu, skulle egenskapen label användas för att ge den sitt namn. Till sist, identifierar återigen id den här menyn (<menu>). Det behövs så att flera .pluginmap-filer kan placera sina insticksprogram i samma menyer. De gör det genom att leta efter en meny (<menu>) med angivet id. Om id inte ännu finns, skapas en ny meny. Annars läggs alternativen till i den befintliga menyn.

<menu id="means" label="Means">
        

Egentligen samma sak här: Nu definierar vi en undermeny i menyn Analysis. Den ska heta Means.

<menu id="ttests" label="t-Tests">
        

Och en sista nivå i menyhierarkin: En undermeny i undermenyn Väntevärden.

<entry component="t_test_two_vars" />
        

Nu till sist är det menyn vi vill placera insticksprogrammet i. Taggen <entry> signalerar att det här är det verkliga värdet istället för en annan undermeny. Egenskapen component refererar till id som angavs i insticksprogrammet/komponenten ovan.

<entry component="fictional_t_test" />
                                </menu>
                                <entry component="fictional_t_test" />
                        </menu>
                        <menu id="frequency" label="Frequency" index="2"/>
        

Om du har förlorat spåret: Det är en annan undermeny i menyn Analys. Se skärmbilden nedan. Vi hoppar över en del av det som inte syns, markerat med [...].

[...]
                        </menu>
                        <entry component="corr_matrix"/>
                        <entry component="descriptive"/>
                        <entry component="simple_anova"/>
                </menu>
        

De är de slutliga alternativen synliga på skärmbilden nedan.

<menu id="plots" label="Plots">
                        [...]
                </menu>
        

Det går naturligtvis också att placera insticksprogrammen i andra menyer än Analys.

<menu id="file" label="File">
                        [...]
                </menu>
        

Till och med i standardmenyer såsom Arkiv. Allt som behövs är rätt id.

</hierarchy>        
</document>
        

Det är så man gör, och skärmbilden visar resultatet:

Menyhierarki skapad av koden som visas ovan

Förvirrad? Det enklaste sättet att komma igång är troligen att ta några av de befintliga .pluginmap-filerna som levereras med distributionen och ändra dem enligt dina behov. Dessutom, om du behöver hjälp, tveka inte att skriva till utvecklarnas e-postlista.

Bestämma menyalternativens ordning

Normalt sorteras automatiskt alla poster (alternativ, undermenyer) alfabetiskt inne i en meny. I vissa fall kan man vilja ha bättre kontroll. I sådana fall kan man gruppera element enligt det följande:

  • Det går att definiera grupper i vilken meny som helst så här. Alla element som hör till samma grupp kommer att grupperas ihop:

    <group id="somegroup"/>
                                    
  • Om gruppen ska vara visuellt separerad från andra alternativ, använd:

    <group id="somegroup" separated="true"/>
                                    
  • Alternativ, menyer och grupper kan läggas till sist i en angiven grupp genom att använda:

    <entry component="..." group="somegroup"/>
                                    
  • Det är i själva verket också möjligt att definiera grupper (utan avskiljande linjer) implicit:

    <entry component="first" group="a"/>
                    <entry component="third"/>
                    <entry component="second" group="a"/>
                                    
  • Gruppnamn är specifika för varje meny. Grupp "a" i menyn "Data" ger exempelvis ingen konflikt med grupp "a" i menyn "Analys".

  • Det vanligaste användarfallet är att definiera grupper längst upp eller längst ner i en meny. De fördefinierade grupperna "top" och "bottom" finns i alla menyer för det.

  • Poster inom varje grupp sorteras alfabetiskt. Grupper visas i den ordning de deklareras (om de inte läggs till sist i en annan grupp naturligtvis).

  • Menyer och alternativ utan gruppspecifikation utgör också logiskt en grupp ("").