Zoeken…


Benoemde functies

R zit vol met functies, het is tenslotte een functionele programmeertaal , maar soms wordt de precieze functie die u nodig hebt niet in de Base-bronnen vermeld. Het is denkbaar dat u een pakket met de functie installeert , maar misschien zijn uw vereisten gewoon zo specifiek dat geen vooraf gemaakte functie past bij de rekening? Dan heb je de mogelijkheid om er zelf een te maken.

Een functie kan heel eenvoudig zijn, tot het punt dat het vrijwel zinloos is. Er is zelfs geen argument nodig:

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

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

Wat tussen de accolades { } is de juiste functie. Zolang je alles op één regel kunt passen, zijn ze niet strikt nodig, maar kunnen ze handig zijn om dingen georganiseerd te houden.

Een functie kan heel eenvoudig zijn, maar toch zeer specifiek. Deze functie neemt als invoer een vector ( vec in dit voorbeeld) en voert dezelfde vector uit met de lengte van de vector (in dit geval 6) afgetrokken van elk van de elementen van de vector.

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

Merk op dat length() op zichzelf een vooraf geleverde (dwz Base ) functie is. Je kunt natuurlijk een eerder zelfgemaakte functie gebruiken binnen een andere zelfgemaakte functie, evenals variabelen toewijzen en andere bewerkingen uitvoeren terwijl je verschillende lijnen overspant:

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 zorgt ervoor dat 4 de standaardwaarde van de argumentvermenigvuldiger multiplier , als er geen waarde wordt opgegeven bij het aanroepen van de functie 4 .

Bovenstaande zijn allemaal voorbeelden van benoemde functies, zogeheten simpelweg omdat ze namen hebben gekregen ( one , two , subtract.length . subtract.length enz.)

Anonieme functies

Een anonieme functie krijgt, zoals de naam al aangeeft, geen naam. Dit kan handig zijn wanneer de functie deel uitmaakt van een grotere bewerking, maar op zichzelf niet veel plaats inneemt. Een veel voorkomende use-case voor anonieme functies valt binnen de *apply familie van Base-functies.

Bereken het wortelgemiddelde vierkant voor elke kolom in een 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 

Maak een reeks van stap-lengte één van de kleinste tot de grootste waarde voor elke rij in een matrix.

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

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

Een anonieme functie kan ook op zichzelf staan:

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

is gelijk aan

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

RStudio codefragmenten

Dit is slechts een kleine hack voor degenen die vaak zelf gedefinieerde functies gebruiken.
Typ "fun" RStudio IDE en druk op TAB.

voer hier de afbeeldingsbeschrijving in

Het resultaat is een skelet van een nieuwe functie.

name <- function(variables) {
        
}

Men kan eenvoudig zijn eigen fragment-sjabloon definiëren, zoals zoals hieronder

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

De optie is Edit Snippets in het menu Global Options -> Code .

Kolomnamen doorgeven als argument van een functie

Soms wil je de namen van kolommen uit een gegevensframe doorgeven aan een functie. Ze kunnen worden geleverd als tekenreeksen en worden gebruikt in een functie met behulp van [[ . Laten we het volgende voorbeeld bekijken, dat afdrukt naar de basisstatistieken van de R-console van geselecteerde variabelen:

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"))

Als gevolg van het uitvoeren van de hierboven gegeven code, worden namen van geselecteerde variabelen en hun basisoverzichtstatistieken (minima, eerste kwantielen, mediaan, gemiddelden, derde kwantielen en maxima) afgedrukt in de R-console. De code dset[[vars[i]]] selecteert i-de element van het argument vars een overeenkomstige kolom in opgegeven set invoergegevens en selecteert dset . Bijvoorbeeld waarbij iris[["Sepal.Length"]] alleen zou drukken Sepal.Length kolom uit de iris gegevensset als vector.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow