Sök…


Namngivna funktioner

R är full av funktioner, det är ju ett funktionellt programmeringsspråk , men ibland finns den exakta funktionen du behöver inte i basresurserna. Du kan tänkbart installera ett paket som innehåller funktionen, men kanske är dina krav bara så specifika att ingen förgjord funktion passar räkningen? Då sitter du kvar med möjligheten att göra dina egna.

En funktion kan vara mycket enkel, så att den är ganska meningslös. Det behöver inte ens argumentera:

one <- function() { 1 }
one()
[1] 1

two <- function() { 1 + 1 }
two()
[1] 2

Det som är mellan de lockiga hängslen { } är rätt funktion. Så länge du kan passa på allt på en enda linje behövs de inte strikt, men kan vara användbara för att hålla saker ordnade.

En funktion kan vara mycket enkel men ändå mycket specifik. Denna funktion tar som inmatning av en vektor ( vec i detta exempel) och matar ut samma vektor med vektorns längd (6 i detta fall) subtraheras från var och en av vektorns element.

vec <- 4:9
subtract.length <- function(x) { x - length(x) }
subtract.length(vec)
[1] -2 -1  0  1  2  3

Lägg märke till att length() i sig är en förlevererad (dvs. bas ) -funktion. Du kan naturligtvis använda en tidigare självgjord funktion i en annan självgjord funktion, samt tilldela variabler och utföra andra operationer medan du spänner över flera rader:

vec2 <- (4:7)/2

msdf <- function(x, multiplier=4) {
    mult <- x * multiplier
    subl <- subtract.length(x)
    data.frame(mult, subl)
}

msdf(vec2, 5)
  mult subl
1 10.0 -2.0
2 12.5 -1.5
3 15.0 -1.0
4 17.5 -0.5

multiplier=4 ser till att 4 är standardvärdet av argumentet multiplier , om inget värde anges när du ringer funktionen 4 är vad som kommer att användas.

Ovanstående är alla exempel på namngivna funktioner, så kallade helt enkelt för att de har fått namn ( one , two , subtract.length etc.)

Anonyma funktioner

En anonym funktion tilldelas inte, som namnet antyder, ett namn. Detta kan vara användbart när funktionen är en del av en större operation, men i sig själv inte sker mycket. Ett vanligt fall för anonyma funktioner är inom *apply basfamiljens basfunktioner.

Beräkna rotens medelkvadrat för varje kolumn i ett data.frame :

df <- data.frame(first=5:9, second=(0:4)^2, third=-1:3)

apply(df, 2, function(x) { sqrt(sum(x^2)) })
    first    second     third 
15.968719 18.814888  3.872983 

Skapa en sekvens med steglängd en från det minsta till det största värdet för varje rad i en matris.

x <- sample(1:6, 12, replace=TRUE)
mat <- matrix(x, nrow=3)

apply(mat, 1, function(x) { seq(min(x), max(x)) })

En anonym funktion kan också stå på egen hand:

(function() { 1 })()
[1] 1

är ekvivalent med

f <- function() { 1 })
f()
[1] 1

RStudio-kodavsnitt

Detta är bara ett litet hack för dem som ofta använder självdefinierade funktioner.
Skriv "kul" RStudio IDE och slå TAB.

ange bildbeskrivning här

Resultatet blir ett skelett av en ny funktion.

name <- function(variables) {
        
}

Man kan enkelt definiera sin egen kodmall, dvs som den nedan

name <- function(df, x, y) {
        require(tidyverse)
        out <- 
        return(out)
}

Alternativet är Edit Snippets i menyn Global Options -> Code .

Att skicka kolumnnamn som argument för en funktion

Ibland vill man skicka namn på kolumner från en dataram till en funktion. De kan tillhandahållas som strängar och användas i en funktion med [[ . Låt oss ta en titt på följande exempel som skriver ut till R-konsolen grundläggande statistik över valda variabler:

basic.stats <- function(dset, vars){
    for(i in 1:length(vars)){
        print(vars[i])
        print(summary(dset[[vars[i]]]))
    }
}

basic.stats(iris, c("Sepal.Length", "Petal.Width"))

Som ett resultat av att köra ovanför given kod, skrivs namn på utvalda variabler och deras grundläggande sammanfattande statistik (minima, första kvantiler, medianer, medel, tredje kvantiler och maxima) i R-konsolen. Koden dset[[vars[i]]] väljer i-te elementet från argumentet vars och väljer en motsvarande kolumn i deklarerade ingångsdatauppsättning dset . Till exempel, som deklarerar iris[["Sepal.Length"]] enbart skulle skriva ut Sepal.Length kolumnen från iris datamängden som en vektor.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow