Video: A Show of Scrutiny | Critical Role | Campaign 2, Episode 2 2024
Het gebruik van lussen in R is erg handig, maar je kunt efficiëntere code schrijven als je niet over de waarden maar over de indices. Hiertoe vervangt u het middelste gedeelte in de functie door de volgende code:
nclient <- length (client) VAT <- numeric (nclient) for (i in seq_along (client)) {VAT [i] <- switch (client [i], private = 1. 12, public = 1. 06, 1))}
Hier zijn enkele verschillen met het gebruik van waarden van de vector voor lussen:
-
U wijst de lengte van de vectorcliënt toe aan de variabele nclient.
-
Vervolgens maakt u een numerieke vector BTW die precies zo lang is als de vectorclient. Dit wordt pre-toewijzing van een vector genoemd.
-
Vervolgens loop je indexen van de client in plaats van de vector zelf door de functie seq_along () te gebruiken. In de eerste doorgang door de lus wordt de eerste waarde in VAT ingesteld als het resultaat van switch () toegepast op de eerste waarde in client. In de tweede passage is de tweede waarde van btw het resultaat van switch () toegepast op de tweede waarde in client enzovoort.
Je komt misschien in de verleiding om seq_along (client) te vervangen door de vector 1: nclient, maar dat zou een slecht idee zijn. Als de vectorclient een lengte van 0 heeft, maakt seq_along (client) een lege vector en voert de code in de lus nooit uit. Als u 1: nclient gebruikt, maakt R een vector c (1, 0) en loopt die twee waarden door elkaar, waardoor u een volledig verkeerd resultaat krijgt.
Telkens wanneer u een object verlengt in R, moet R het hele object kopiëren en naar een nieuwe plaats in het geheugen verplaatsen. Dit heeft twee effecten:
-
Allereerst vertraagt het je code, omdat al het kopiëren tijd kost.
-
Ten tweede, omdat R voortdurend dingen in het geheugen rondwaart, wordt dit geheugen opgesplitst in veel kleine ruimtes.
Dit wordt fragmentatie, genoemd en het maakt de communicatie tussen R en het geheugen minder soepel. U kunt deze fragmentatie vermijden door geheugen vooraf te alloceren zoals in het vorige voorbeeld.