Video: TIMELAPSE OF THE FUTURE: A Journey to the End of Time (4K) 2024
Bruk av løkker i R er veldig nyttig, men du kan skrive mer effektiv kode hvis du ikke går over verdier, men over indeksene. For å gjøre det erstatter du den midterste delen i funksjonen med følgende kode:
nclient <- lengde (klient) MVA <- numerisk (nclient) for (jeg i seq_along (klient)) {MVA [i] <- Switch (klient [i], privat = 1. 12, offentlig = 1. 06, 1))}
Her er noen forskjeller fra å bruke verdier for vektoren for looping:
-
Du tilordner lengden på vektorklienten til variabelen nclient.
-
Deretter lager du en numerisk vektorgskats som er like lang som vektorklienten. Dette kalles forhåndsfordeling av en vektor.
-
Så slår du over indekser av klient i stedet for selve vektoren ved å bruke funksjonen seq_along (). I første passering gjennom sløyfen er den første verdien i mva satt til å være resultatet av bryteren () påført den første verdien i klienten. I andre pass, er den andre verdien av mva resultatet av bryteren () påført den andre verdien i klient og så videre.
Du kan bli fristet til å erstatte seq_along (klient) med vektoren 1: nclient, men det ville være en dårlig ide. Hvis vektorklienten har en lengde på 0, oppretter seq_along (klient) en tom vektor og koden i løkken utføres aldri. Hvis du bruker 1: nclient, oppretter R en vektor c (1, 0) og slår over disse to verdiene, noe som gir deg et helt feil resultat.
Hver gang du lengder et objekt i R, må R kopiere hele objektet og flytte det til et nytt sted i minnet. Dette har to effekter:
-
Først senker det koden din, fordi all kopiering tar tid.
-
For det andre, ettersom R kontinuerlig beveger ting rundt i minnet, blir dette minnet delt opp i mange små mellomrom.
Dette kalles fragmentering, , og det gjør kommunikasjonen mellom R og minnet mindre glatt. Du kan unngå denne fragmenteringen ved forhåndsfordeling -minne som i forrige eksempel.