Funkce v programování R (s příkladem)

Obsah:

Anonim

Co je funkce v R?

Funkce v programovacím prostředí, je sada instrukcí. Programátor vytvoří funkci, aby se vyhnul opakování stejného úkolu, nebo aby se snížila složitost.

Funkce by měla být

  • napsán k provedení zadaného úkolu
  • může nebo nemusí obsahovat argumenty
  • obsahovat tělo
  • může nebo nemusí vrátit jednu nebo více hodnot.

Obecným přístupem k funkci je použít argumentovou část jako vstupy , poslat část těla a nakonec vrátit výstup . Syntaxe funkce je následující:

function (arglist) {#Function body}

V tomto tutoriálu se naučíme

  • R důležité integrované funkce
  • Obecné funkce
  • Matematické funkce
  • Statistické funkce
  • Funkce zápisu do R.
  • Kdy bychom měli napsat funkci?
  • Funkce s podmínkou

R důležité integrované funkce

V R. Existuje spousta vestavěné funkce. R odpovídá vašim vstupním parametrům s jejími argumenty funkce, buď podle hodnoty, nebo podle polohy, poté provede tělo funkce. Argumenty funkcí mohou mít výchozí hodnoty: pokud tyto argumenty nezadáte, použije R výchozí hodnotu.

Poznámka : Zdrojový kód funkce je možné zobrazit spuštěním názvu samotné funkce v konzole.

Uvidíme tři skupiny funkcí v akci

  • Obecná funkce
  • Matematická funkce
  • Statistická funkce

Obecné funkce

Obecné funkce jako cbind (), rbind (), range (), sort (), order () již známe. Každá z těchto funkcí má konkrétní úkol, bere argumenty pro vrácení výstupu. Následují důležité funkce, které musíte znát -

funkce diff ()

Pokud pracujete na časové řadě , musíte sérii zastavit tím, že vezmete jejich zpožděné hodnoty . Stacionární proces umožňuje konstantní průměr, rozptyl a autokorelace v průběhu času. To hlavně zlepšuje predikci časové řady. To lze snadno provést pomocí funkce diff (). Můžeme vytvořit náhodná data časových řad s trendem a poté použít funkci diff () k ustálení řady. Funkce diff () přijímá jeden argument, vektor a vrátí vhodný zpožděný a iterovaný rozdíl.

Poznámka : Často musíme vytvářet náhodná data, ale pro učení a srovnání chceme, aby čísla byla u všech strojů stejná. Abychom zajistili, že všichni generujeme stejná data, používáme funkci set.seed () s libovolnými hodnotami 123. Funkce set.seed () je generována procesem generátoru pseudonáhodných čísel, díky kterému mají všechny moderní počítače stejnou sekvenci čísel. Pokud nepoužíváme funkci set.seed (), budeme mít všichni různou posloupnost čísel.

set.seed(123)## Create the datax = rnorm(1000)ts <- cumsum(x)## Stationary the seriediff_ts <- diff(ts)par(mfrow=c(1,2))## Plot the seriesplot(ts,)plot(diff(ts),)

funkce length ()

V mnoha případech chceme znát délku vektoru pro výpočet nebo použít ve smyčce for. Funkce length () spočítá počet řádků ve vektoru x. Následující kódy importují datovou sadu automobilů a vrátí počet řádků.

Poznámka : length () vrací počet prvků ve vektoru. Pokud je funkce předána do matice nebo datového rámce, je vrácen počet sloupců.

dt <- cars## number columnslength(dt)

Výstup:

## [1] 1
## number rowslength(dt[,1])

Výstup:

## [1] 50

Matematické funkce

R má řadu matematických funkcí.

Operátor Popis
abs (x) Přebírá absolutní hodnotu x
log (x, base = y) Vezme logaritmus x se základnou y; pokud není zadána báze, vrátí přirozený logaritmus
exp (x) Vrátí exponenciální hodnotu x
sqrt (x) Vrátí druhou odmocninu x
faktoriál (x) Vrátí faktoriál x (x!)
# sequence of number from 44 to 55 both including incremented by 1x_vector <- seq(45,55, by = 1)#logarithmlog(x_vector)

Výstup:

## [1] 3.806662 3.828641 3.850148 3.871201 3.891820 3.912023 3.931826## [8] 3.951244 3.970292 3.988984 4.007333
#exponentialexp(x_vector)
#squared rootsqrt(x_vector)

Výstup:

## [1] 6.708204 6.782330 6.855655 6.928203 7.000000 7.071068 7.141428## [8] 7.211103 7.280110 7.348469 7.416198
#factorialfactorial(x_vector)

Výstup:

## [1] 1.196222e+56 5.502622e+57 2.586232e+59 1.241392e+61 6.082819e+62## [6] 3.041409e+64 1.551119e+66 8.065818e+67 4.274883e+69 2.308437e+71## [11] 1.269640e+73

Statistické funkce

Standardní instalace R obsahuje širokou škálu statistických funkcí. V tomto tutoriálu se stručně podíváme na nejdůležitější funkci…

Základní statistické funkce

Operátor

Popis

průměr (x)

Průměr x

medián (x)

Medián x

var (x)

Rozptyl x

sd (x)

Směrodatná odchylka x

měřítko (x)

Standardní skóre (z-skóre) x

kvantil (x)

Kvartily x

souhrn (x)

Souhrn x: průměr, min, max atd ...

speed <- dt$speedspeed# Mean speed of cars datasetmean(speed)

Výstup:

## [1] 15.4
# Median speed of cars datasetmedian(speed)

Výstup:

## [1] 15
# Variance speed of cars datasetvar(speed)

Výstup:

## [1] 27.95918
# Standard deviation speed of cars datasetsd(speed)

Výstup:

## [1] 5.287644
# Standardize vector speed of cars datasethead(scale(speed), 5)

Výstup:

## [,1]## [1,] -2.155969## [2,] -2.155969## [3,] -1.588609## [4,] -1.588609## [5,] -1.399489
# Quantile speed of cars datasetquantile(speed)

Výstup:

## 0% 25% 50% 75% 100%## 4 12 15 19 25
# Summary speed of cars datasetsummary(speed)

Výstup:

## Min. 1st Qu. Median Mean 3rd Qu. Max.## 4.0 12.0 15.0 15.4 19.0 25.0

Až do tohoto bodu jsme se naučili spoustu vestavěných funkcí R.

Poznámka : Buďte opatrní s třídou argumentu, tj. Číselnou, logickou nebo řetězcovou. Například pokud potřebujeme předat hodnotu řetězce, musíme řetězec uvést do uvozovek: „ABC“.

Funkce zápisu do R.

V některých případech musíme napsat vlastní funkci, protože musíme splnit určitý úkol a žádná hotová funkce neexistuje. Uživatelem definovaná funkce zahrnuje jméno , argumenty a tělo .

function.name <- function(arguments){computations on the argumentssome other code}

Poznámka : Dobrým postupem je pojmenovat uživatelem definovanou funkci odlišnou od vestavěné funkce. Vyhýbá se nejasnostem.

Funkce jednoho argumentu

V dalším fragmentu definujeme jednoduchou čtvercovou funkci. Funkce přijímá hodnotu a vrací druhou mocninu hodnoty.

square_function<- function(n){# compute the square of integer `n`n^2}# calling the function and passing value 4square_function(4)

Vysvětlení kódu:

  • Funkce má název square_function; dá se to nazvat, jak chceme.
  • Obdrží argument „n“. Nezadali jsme typ proměnné, aby uživatel mohl předat celé číslo, vektor nebo matici
  • Funkce přebírá vstup „n“ a vrací druhou mocninu vstupu.

    Až tuto funkci dokončíte, můžeme ji odstranit pomocí funkce rm ().

# po vytvoření funkce

rm(square_function)square_function

Na konzole vidíme chybovou zprávu: Chyba: objekt 'square_function' nebyl nalezen a říká, že funkce neexistuje.

Rozsah prostředí

V R, prostředí je kolekce objektů, jako jsou funkce, proměnné datového rámce, atd

R otevře prostředí pokaždé, když je vyzván Rstudio.

Nejvyšším dostupným prostředím je globální prostředí s názvem R_GlobalEnv. A máme místní prostředí.

Můžeme vypsat obsah aktuálního prostředí.

ls(environment())

Výstup

## [1] "diff_ts" "dt" "speed" "square_function"## [5] "ts" "x" "x_vector"

Můžete vidět všechny proměnné a funkce vytvořené v R_GlobalEnv.

Výše uvedený seznam se pro vás bude lišit na základě historického kódu, který spustíte v R Studio.

Všimněte si, že n, argument funkce square_function není v tomto globálním prostředí .

Pro každou funkci je vytvořeno nové prostředí. Ve výše uvedeném příkladu vytvoří funkce square_function () nové prostředí uvnitř globálního prostředí.

Abychom objasnili rozdíl mezi globálním a lokálním prostředím , prostudujme si následující příklad

Tyto funkce vezmou hodnotu x jako argument a přidají ji k definování y vně a uvnitř funkce

Funkce f vrací výstup 15. Je to proto, že y je definováno v globálním prostředí. Jakoukoli proměnnou definovanou v globálním prostředí lze použít místně. Proměnná y má hodnotu 10 během všech volání funkcí a je přístupná kdykoli.

Podívejme se, co se stane, když je proměnná y definována uvnitř funkce.

Před spuštěním tohoto kódu pomocí rm r musíme dropp `y`

Výstup je také 15, když voláme f (5), ale vrátí chybu, když se pokusíme vytisknout hodnotu y. Proměnná y není v globálním prostředí.

Nakonec R používá nejnovější definici proměnné k předání uvnitř těla funkce. Zvažme následující příklad:

R ignoruje hodnoty y definované mimo funkci, protože jsme explicitně vytvořili ay proměnnou uvnitř těla funkce.

Funkce více argumentů

Můžeme napsat funkci s více než jedním argumentem. Zvažte funkci nazvanou „časy“. Jedná se o přímou funkci, která vynásobí dvě proměnné.

times <- function(x,y) {x*y}times(2,4)

Výstup:

## [1] 8

Kdy bychom měli napsat funkci?

Datový vědec musí dělat mnoho opakujících se úkolů. Většinu času opakujeme kopírování a vkládání kusů kódu. Například před spuštěním algoritmu strojového učení se velmi doporučuje normalizace proměnné. Vzorec pro normalizaci proměnné je:

Už víme, jak použít funkci min () a max () v R. K vytvoření datového rámce používáme knihovnu tibble. Tibble je zatím nejpohodlnější funkcí pro vytvoření datové sady od nuly.

library(tibble)# Create a data framedata_frame <- tibble(c1 = rnorm(50, 5, 1.5),c2 = rnorm(50, 5, 1.5),c3 = rnorm(50, 5, 1.5),)

Výpočet výše popsané funkce provedeme ve dvou krocích. V prvním kroku vytvoříme proměnnou nazvanou c1_norm, což je změna měřítka c1. V kroku dva pouze zkopírujeme a vložíme kód c1_norm a změníme jej pomocí c2 a c3.

Detail funkce se sloupcem c1:

Jmenovatel:: data_frame $ c1 -min (data_frame $ c1))

Jmenovatel: max (data_frame $ c1) -min (data_frame $ c1))

Proto je můžeme rozdělit, abychom získali normalizovanou hodnotu sloupce c1:

(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1)) 

Můžeme vytvořit c1_norm, c2_norm a c3_norm:

Create c1_norm: rescaling of c1data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))# show the first five valueshead(data_frame$c1_norm, 5)

Výstup:

## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991

Funguje to. Můžeme kopírovat a vložit

data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))

pak změňte c1_norm na c2_norm a c1 na c2. To samé děláme, abychom vytvořili c3_norm

data_frame$c2_norm <- (data_frame$c2 - min(data_frame$c2))/(max(data_frame$c2)-min(data_frame$c2))data_frame$c3_norm <- (data_frame$c3 - min(data_frame$c3))/(max(data_frame$c3)-min(data_frame$c3))

Dokonale jsme změnili měřítko proměnných c1, c2 a c3.

Tato metoda je však náchylná k omylům. Po vložení jsme mohli zkopírovat a zapomenout změnit název sloupce. Dobrým postupem je tedy napsat funkci pokaždé, když potřebujete vložit stejný kód více než dvakrát. Můžeme uspořádat kód do vzorce a zavolat jej, kdykoli je to potřeba. Abychom mohli napsat vlastní funkci, musíme dát:

  • Název: normalizovat.
  • počet argumentů: Potřebujeme pouze jeden argument, což je sloupec, který používáme při výpočtu.
  • Tělo: toto je jednoduše vzorec, který chceme vrátit.

Budeme postupovat krok za krokem k vytvoření funkce normalizovat.

Krok 1) Vytvoříme jmenovatele , kterým je. V R můžeme nominátora uložit do takové proměnné:

nominator <- x-min(x)

Krok 2) My počítáme jmenovatele: . Můžeme replikovat myšlenku kroku 1 a výpočet uložit do proměnné:

denominator <- max(x)-min(x)

Krok 3) Provedeme rozdělení mezi jmenovatele a jmenovatele.

normalize <- nominator/denominator

Krok 4) Chcete-li vrátit hodnotu volající funkci, musíme předat normalizaci uvnitř return (), abychom získali výstup funkce.

return(normalize)

Krok 5) Jsme připraveni tuto funkci použít zabalením všeho uvnitř závorky.

normalize <- function(x){# step 1: create the nominatornominator <- x-min(x)# step 2: create the denominatordenominator <- max(x)-min(x)# step 3: divide nominator by denominatornormalize <- nominator/denominator# return the valuereturn(normalize)}

Otestujme naši funkci s proměnnou c1:

normalize(data_frame$c1)

Funguje to perfektně. Vytvořili jsme naši první funkci.

Funkce jsou komplexnějším způsobem provádění opakujících se úkolů. Normalizační vzorec můžeme použít v různých sloupcích, například níže:

data_frame$c1_norm_function <- normalize (data_frame$c1)data_frame$c2_norm_function <- normalize (data_frame$c2)data_frame$c3_norm_function <- normalize (data_frame$c3)

I když je příklad jednoduchý, můžeme odvodit sílu vzorce. Výše uvedený kód je snáze čitelný a zejména se vyvarujte chyb při vkládání kódů.

Funkce s podmínkou

Někdy musíme do funkce zahrnout podmínky, které umožní kódu vrátit různé výstupy.

V úlohách Machine Learning musíme rozdělit datovou sadu mezi vlakovou soupravu a testovací sadu. Vlaková souprava umožňuje algoritmu poučit se z dat. Abychom mohli otestovat výkon našeho modelu, můžeme pomocí testovací sady vrátit měřítko výkonu. R nemá funkci k vytvoření dvou datových sad. Můžeme k tomu napsat vlastní funkci. Naše funkce má dva argumenty a nazývá se split_data (). Myšlenka je jednoduchá, vynásobíme délku datové sady (tj. Počet pozorování) 0,8. Například pokud chceme rozdělit datovou sadu 80/20 a naše datová sada obsahuje 100 řádků, pak naše funkce vynásobí 0,8 * 100 = 80. Bude vybráno 80 řádků, které se stanou našimi tréninkovými daty.

K testování naší uživatelem definované funkce použijeme datovou sadu airquality. Datová sada airquality má 153 řádků. Vidíme to s níže uvedeným kódem:

nrow(airquality)

Výstup:

## [1] 153 

Budeme postupovat následovně:

split_data <- function(df, train = TRUE)Arguments:-df: Define the dataset-train: Specify if the function returns the train set or test set. By default, set to TRUE

Naše funkce má dva argumenty. Vlak argumentů je booleovský parametr. Pokud je nastavena na TRUE, naše funkce vytvoří vlakovou datovou sadu, jinak vytvoří testovací datovou sadu.

Můžeme postupovat, jako jsme udělali funkci normalizovat (). Napíšeme kód, jako by to byl jen jednorázový kód, a pak zabalíme vše s podmínkou do těla, abychom vytvořili funkci.

Krok 1:

Musíme vypočítat délku datové sady. To se provádí pomocí funkce nrow (). Nrow vrací celkový počet řádků v datové sadě. Říkáme proměnná délka.

length<- nrow(airquality)length

Výstup:

## [1] 153

Krok 2:

Vynásobíme délku 0,8. Vrátí počet řádků, které chcete vybrat. Mělo by to být 153 * 0,8 = 122,4

total_row <- length*0.8total_row

Výstup:

## [1] 122.4

Chceme vybrat 122 řádků mezi 153 řádky v datové sadě airquality. Vytvoříme seznam obsahující hodnoty od 1 do total_row. Výsledek uložíme do proměnné zvané split

split <- 1:total_rowsplit[1:5] 

Výstup:

## [1] 1 2 3 4 5

split vybere prvních 122 řádků z datové sady. Například můžeme vidět, že naše proměnné rozdělení shromažďuje hodnotu 1, 2, 3, 4, 5 atd. Tyto hodnoty budou indexem, když vybereme řádky, které se mají vrátit.

Krok 3:

Musíme vybrat řádky v datové sadě airquality na základě hodnot uložených v rozdělené proměnné. To se děje takto:

train_df <- airquality[split, ]head(train_df)

Výstup:

##[1] Ozone Solar.R Wind Temp Month Day##[2] 51 13 137 10.3 76 6 20##[3] 15 18 65 13.2 58 5 15##[4] 64 32 236 9.2 81 7 3##[5] 27 NA NA 8.0 57 5 27##[6] 58 NA 47 10.3 73 6 27##[7] 44 23 148 8.0 82 6 13

Krok 4:

Můžeme vytvořit testovací datovou sadu pomocí zbývajících řádků, 123: 153. To se provádí pomocí - před rozdělením.

test_df <- airquality[-split, ]head(test_df)

Výstup:

##[1] Ozone Solar.R Wind Temp Month Day##[2] 123 85 188 6.3 94 8 31##[3] 124 96 167 6.9 91 9 1##[4] 125 78 197 5.1 92 9 2##[5] 126 73 183 2.8 93 9 3##[6] 127 91 189 4.6 93 9 4##[7] 128 47 95 7.4 87 9 5

Krok 5:

Můžeme vytvořit podmínku uvnitř těla funkce. Nezapomeňte, že máme argumentový vlak, který je ve výchozím nastavení nastaven na TRUE, aby se vlaková sada vrátila. K vytvoření podmínky použijeme syntaxi if:

if (train ==TRUE){train_df <- airquality[split, ]return(train)} else {test_df <- airquality[-split, ]return(test)}

To je ono, můžeme napsat funkci. Musíme pouze změnit airquality na df, protože chceme vyzkoušet naši funkci na jakémkoli datovém rámci, nejen airquality:

split_data <- function(df, train = TRUE){length<- nrow(df)total_row <- length *0.8split <- 1:total_rowif (train ==TRUE){train_df <- df[split, ]return(train_df)} else {test_df <- df[-split, ]return(test_df)}}

Zkusme naši funkci na datové sadě airquality. měli bychom mít jednu vlakovou soupravu se 122 řádky a zkušební soupravu s 31 řádky.

train <- split_data(airquality, train = TRUE)dim(train)

Výstup:

## [1] 122 6
test <- split_data(airquality, train = FALSE)dim(test)

Výstup:

## [1] 31 6