2. S4 klasser

Vi undersoker hvordan du lager S4-klasser. Det antas at du er kjent med de grunnleggende datatyper og skripting (Introduksjon til programmering).

2.1. Den grunnleggende ideen

S4-tiln rmingen er forskjellig fra S3-tiln rmingen til a skape en klasse ved at den er en mer stiv definisjon. Tanken er at et objekt opprettes ved hjelp av setClass-kommandoen. Kommandoen tar en rekke alternativer. Mange av alternativene er ikke pakrevd, men vi benytter flere av de valgfrie argumentene fordi de representerer god praksis med hensyn til objektorientert programmering.

Vi bygger forst en triviell, konstruert klasse for a demonstrere grunnleggende ideen. Neste viser vi hvordan man lager en metode for en S4-klasse. Dette eksemplet er litt mer involvert enn det vi sa i avsnittet om S3-klasser.

I dette eksemplet er klassens navn FirstQuadrant, og klassen brukes til a holde styr pa et (x, y) koordinatpar i den forste kvadranten. Det er en begrensning at begge verdiene ma v re storre enn eller lik null. Det er to dataelementer, kalt spor, og de kalles x og y. Standardverdiene for koordinaten er opprinnelsen, x = 0 og y = 0.

V r oppmerksom pa at maten a fa tilgang til en av dataelementene, er a bruke & # 8220; & # 64; & # 8221; symbol. Et eksempel hvis gitt nedenfor. I eksemplet er tre elementer av klassen definert ovenfor opprettet. Den forste bruker standardverdiene for sporene, den andre overstyrer standardinnstillingene, og til slutt blir det forsokt a lage en koordinat i den andre kvadranten.

I neste eksempel oppretter vi en metode som er knyttet til klassen. Metoden brukes til a angi verdiene for en koordinat. Det forste trinnet er a reservere navnet ved hjelp av setGeneric-kommandoen, og deretter er setMethod-kommandoen brukt til a definere funksjonen som skal kalles nar det forste argumentet er en gjenstand fra FirstQuadrant-klassen.

Det er viktig a merke seg at R generelt overforer objekter som verdier. Av denne grunn returnerer metodene som er definert ovenfor det oppdaterte objektet. Nar metoden kalles, brukes den til a erstatte det tidligere objektet med det oppdaterte objektet.

Merk at gyldighetsfunksjonen som er oppgitt i den opprinnelige klasses Definisjonen, ikke kalles. Det kalles nar et objekt er forst definert. Den kan kalles senere, men bare nar en eksplisitt foresporsel er gjort ved hjelp av kommandoen validObject.

2.2. Opprette en S4-klasse

En S4-klasse er opprettet ved hjelp av setClass () -kommandoen. I det minste oppgis navnet pa klassen og navnene pa dataelementene (sporene) er angitt. Det finnes en rekke andre alternativer, og bare som et sporsmal om god praksis spesifiserer vi ogsa en funksjon for a verifisere at dataene er konsistente (validering), og vi angir standardverdiene (prototypen). I den siste delen av denne siden, S4 arv, inkluderer vi en ekstra parameter som brukes til a spesifisere et klassehierarki.

I dette avsnittet ser vi pa et annet eksempel, og vi undersoker noen av funksjonene knyttet til S4-klassene. Eksemplet vi definerer vil bli brukt til a motivere bruken av metoder knyttet til en klasse, og det vil bli brukt til a demonstrere arv senere. Tanken er at vi vil lage et program for a simulere en cellular automatmodell av et rovdyr-byttesystem.

Vi utvikler ikke hele koden her, men konsentrere oss om datastrukturene. Spesielt vil vi lage en grunnklasse for agenter. I neste avsnitt skal vi lage de grunnleggende metodene for klassen. I arvsseksjonen diskuteres hvordan man bygger pa klassen for a skape forskjellige rovdyr og forskjellige byttedyr. Den grunnleggende strukturen til klassen er vist i figur 1.

Metodene for denne klassen er definert i folgende avsnitt. Her definerer vi klassen og dens spor, og koden for a definere klassen er gitt nedenfor:

Na som koden for a definere klassen er gitt, kan vi lage et objekt hvis klasse er Agent.

For vi definerer metodene for klassen, utforskes en rekke tilleggskommandoer. Det forste settet med funksjoner som utforskes, er is.object og isS4-kommandoene. Kommandoen is.object bestemmer hvorvidt en variabel refererer til en objekt eller ikke. IsS4-kommandoen bestemmer hvorvidt variabelen er en S4-objekt eller ikke. Grunnen til at begge kreves er at alene isS4-kommandoen ikke kan bestemme om en variabel er en S3-objekt. Du ma avgjore om variabelen er en gjenstand og deretter bestemme om det er S4 eller ikke.

Det neste settet med kommandoer brukes til a fa informasjon om dataelementene eller sporene i et objekt. Den forste er kommandoen slotNames. Denne kommandoen kan ta enten et objekt eller navnet pa en klasse. Den returnerer navnene pa sporene som er knyttet til klassen som strenge.

Kommandoen getSlots ligner pa slotNames-kommandoen. Det tar navnet pa en klasse som en streng. Den returnerer en vektor hvis oppforinger er typer knyttet til sporene, og navnene pa oppforingene er navnene pa sporene.

Neste kommando undersokt er getClass-kommandoen. Den har to former. Hvis du gir den en variabel som er en S4 klasse, returnerer den en liste med spor for klassen som er knyttet til variabelen. Hvis du gir den en tegnstreng med navnet pa en klasse, gir den sporene og deres datatyper.

Den endelige kommandoen som er undersokt, er sporkommandoen. Det kan brukes til a fa eller sette verdien av et spor i en gjenstand. Den kan brukes i stedet for & # 8220; & # 64; & # 8221; operator.

2.3. Opprette metoder

Vi bygger na pa Agent-klassen som definert ovenfor. Nar klassen og dens dataelementer er definert, kan vi definere metodene som er knyttet til klassen. Den grunnleggende ideen er at hvis navnet pa en funksjon ikke er definert, ma navnet forst reserveres ved hjelp av setGeneric-funksjonen. Settemetoden kan da brukes til a definere hvilken funksjon som kalles basert pa klassenavnene til objektene som sendes til den.

Vi definerer metodene knyttet til Agent-metoden gitt i forrige avsnitt. Merk at gyldighetsfunksjonen for en gjenstand bare kalles nar den forst opprettes, og nar et eksplisitt anrop til validObject-funksjonen blir gjort. Vi benytter kommandoen validObject i metodene nedenfor som brukes til a endre verdien av et dataelement i et objekt.

Med disse definisjonene er dataelementene innkapslet og kan nas og settes ved hjelp av metodene som er gitt ovenfor. Det er generelt god praksis i objektorientert programmering for a holde dataene dine private og ikke vise dem til alle som er villige.

Det siste emnet som ble undersokt, er ideen om overbelastningsfunksjoner. I eksemplene ovenfor er signaturen satt til et enkelt element. Signaturen er en vektor med tegn og angir datatyper for argumentlisten for metoden som skal defineres. Her oppretter vi to nye metoder. Navnet pa metoden er resetActivity, og det er to versjoner.

Den forste versjonen godtar to argumenter hvis typer er Agent og logisk. Denne versjonen av metoden vil sette aktivitetssporet til en gitt verdi. Den andre versjonen aksepterer to argumenter hvis typer er Agent og numerisk. Denne versjonen vil sette aktiviteten til TRUE og deretter sette energinivaet til verdien som er overfort til den. Merk at navnene pa variablene i argumentlisten ma v re noyaktig det samme.

Denne definisjonen av funksjonen gir to alternativer for resetActivity-funksjonen. Beslutningen om a bestemme hvilken funksjon som skal ringes, avhenger av to argumenter og deres type. Hvis for eksempel det forste argumentet er fra Agent-klassen og det andre er en verdi av SANT eller FALSK, blir den forste versjonen av funksjonen kalt. Ellers, hvis det andre argumentet er et nummer, kalles den andre versjonen av funksjonen.

2.4. Inheritance¶

En klasse & # 8217; arvshiearki kan spesifiseres nar klassen er definert ved hjelp av alternativet inneholder. Inkluderingsalternativet er en vektor som viser klassene den nye klassen arver fra. I folgende eksempel bygger vi pa Agent-klassen som er definert i forrige avsnitt. Tanken er at vi trenger agenter som representerer en rovdyr og to byttedyr. Vi vil fokusere pa to rovdyr for dette eksempelet.

Hierarkiet for klassene er vist i figur 2. I dette eksemplet har vi en Prey-klasse som er avledet fra Agent-klassen. Det er to rovdyrklasser, Bobcat og Lynx. Bobcat-klassen er avledet fra Agent-klassen, og Lynx-klassen er avledet fra Bobcat-klassen. Vi vil holde dette veldig enkelt, og de eneste metodene knyttet til de nye klassene er en trekkmetode. For vart formal vil det bare skrive ut en melding og sette verdiene for posisjon og hastighet for a vise rekkefolgen pa utforelse av metodene som er knyttet til klassene.

Det forste trinnet er a lage de tre nye klassene.

Arven er spesifisert ved a bruke inneholder-alternativet i kommandoen setClass. Merk at dette kan v re en vektor som tillater flere arv. Vi velger a ikke bruke det for a holde ting enklere. Hvis du foler at du trenger mer selvtillit i livet ditt, bor du prove det og eksperimentere.

Deretter definerer vi en metode, flytt, for de nye klassene. Vi vil inkludere metoder for Agent, Prey, Bobcat og Lynx klassene. Metodene gjor egentlig ikke noe, men brukes til a demonstrere ideen om hvordan metoder utfores.

Det er en rekke ting a merke seg. Forst kaller hver metode kommandoen callNextMethod. Denne kommandoen utforer neste versjon av samme metode for den forrige klassen i hierarkiet. Merk at jeg har tatt med argumentene (i samme rekkefolge) som de som ble kalt av den opprinnelige funksjonen. V r ogsa oppmerksom pa at funksjonen returnerer en kopi av objektet og brukes til a oppdatere objektet som er overfort til den opprinnelige funksjonen.

En annen ting a merke seg er at metodene som er knyttet til Lync, Bobcat og Agent-klassene, vilkarlig endre verdiene for posisjon, hastighet og aktivitet for det gitte objektet. Dette er gjort for a demonstrere endringene som finner sted og styrke nodvendigheten av a bruke callNextMethod-funksjonen slik den brukes her.

Til slutt skal det bemerkes at kommandoen validObject kalles i hver metode. Du bor prove a legge til en utskriftserkl ring i validitetsfunksjonen. Det kan hende du finner ut at bestillingen er litt rar. Du bor eksperimentere med dette og leke med det. Det er ganger du ikke far de forventede resultatene, sa v r forsiktig!

Vi gir na et kort eksempel for a vise hvilken rekkefolge funksjonene kalles. I eksemplet oppretter vi et Bobcat-objekt og deretter kaller bevegelsesmetoden. Vi lager et Lynx-objekt og gjor det samme. Vi skriver ut sporene for begge agenter bare for a demonstrere verdiene som endres.

Dette nettstedet stottes sterkt av Datacamp. Datacamp tilbyr en gratis, interaktiv introduksjon til R-kodingstutorial som en ekstra ressurs. Allerede over 100 000 mennesker tok denne gratis oppl ringen for a skjerpe sine R-kodende ferdigheter.


Vil du spille i det mest ærlige kasinoet? Vi forbereder det for deg. Prøv her nå!