Hur man använder interna funktioner i R

August 12

Ibland kan det vara till stor hjälp att använda interna funktioner i R. Skriva dina uppgifter på ett sådant sätt att de behöver objekt i den globala miljön doesnâ € t verkligen vettigt, eftersom du använder funktioner för att undvika beroende av objekt i den globala miljö i första hand.

Faktum är att hela konceptet bakom R motsätter starkt att använda globala variabler som används i olika funktioner. Som ett funktionellt programmeringsspråk, är en av de viktigaste idéerna i R att resultatet av en funktion inte ska vara beroende av något annat än värdena för de argument som funktionen. Om du ger argumenten samma värderingar, får du alltid samma resultat.

Om du kommer från andra programmeringsspråk som Java, kan denna egenskap slå dig som udda, men det har sina förtjänster. Ibland behöver man upprepa vissa beräkningar några gånger inom en funktion, men dessa beräkningar bara vettigt inne den funktionen.

Anta att du vill jämföra ljus produktionen av vissa lampor på halv effekt och full effekt. Handdukarna du sätter framför fönstret för att blockera solen ut arenâ € t verkligen upp till jobbet, så du även mäta hur mycket ljus som fortfarande kommer igenom. Du vill subtrahera medelvärdet av detta värde från resultaten för att korrigera dina mått.

För att beräkna effektivitet på 50 procent makt, kan du använda följande funktion:

calculate.eff <- funktion (x, y, kontroll) {
min.base <- funktion (z) z - medelvärde (kontroll)
min.base (x) / min.base (y)
}

Inuti calculate.eff () funktionen, ser du en annan definition funktion för en min.base funktion (). Exakt som i fallet med andra objekt, är denna funktion som skapas i den lokala miljön av calculate.eff () och förstörs igen när funktionen är klar. Du wonâ € t hitta min.base () tillbaka på arbetsytan.

Du kan använda funktionen enligt följande:

> Hälften <- c (2,23, 3,23, 1,48)
> Fullt <- c (4,85, 4,95, 4,12)
> Ingenting <- c (0,14, 0,18, 0,56, 0,23)
> Calculate.eff (halv, hel, ingenting)
[1] 0,4270093 0,6318887 0,3129473

Om du tittar lite närmare på definitionen av min.base () funktionen, märker du att den använder ett föremål kontroll men doesnâ € t har ett argument med det namnet. Hur fungerar det här då? När du ringer funktionen händer följande:

  1. Funktionen calculate.eff () skapar en ny lokal miljö som innehåller de objekt x (med värdet av femtio), y (med värdet av hundra), kontroll (med värdet av ingenting), liksom funktionen min. bas ().
  2. Funktionen min.base () skapar en ny närmiljö inom en av calculate.eff () innehåller endast ett objekt z med värdet på x.
  3. min.base () ser för objektet kontroll i miljön av calculate.eff () och subtraherar medelvärdet av denna vektor från varje antal z. Detta värde återförs sedan.
  4. Samma sak händer igen, men den här gången z blir värdet på y.
  5. Båda resultaten är uppdelade av en annan, och resultatet förs vidare till den globala miljön på nytt.

Den lokala miljön är inbäddad i den miljö där funktionen är definierad, inte där itâ € s kallas. Anta att du använder addPercent () inuti calculate.eff () för att formatera siffrorna. Den lokala miljön skapad av addPercent () är inte inbäddad i en av calculate.eff () men i den globala miljön, där addPercent () definieras.