Ricerca…


Funzioni con nome

R è pieno di funzioni, dopotutto è un linguaggio di programmazione funzionale , ma a volte la funzione precisa di cui hai bisogno non è fornita nelle risorse di base. Si potrebbe ipoteticamente installare un pacchetto contenente la funzione, ma forse i tuoi requisiti sono così specifici che nessuna funzione preimpostata si adatta alla fattura? Quindi ti rimane la possibilità di crearne uno tuo.

Una funzione può essere molto semplice, al punto di essere praticamente inutile. Non ha nemmeno bisogno di discutere:

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

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

Cosa c'è tra le parentesi graffe { } è la funzione corretta. Finché è possibile adattare tutto su una singola riga, non sono strettamente necessari, ma possono essere utili per mantenere le cose organizzate.

Una funzione può essere molto semplice, ma altamente specifica. Questa funzione prende come input un vettore ( vec in questo esempio) e restituisce lo stesso vettore con la lunghezza del vettore (6 in questo caso) sottratta da ciascuno degli elementi del vettore.

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

Si noti che length() è di per sé una funzione pre-fornita (es. Base ). Ovviamente è possibile utilizzare una funzione creata in precedenza all'interno di un'altra funzione creata dall'utente, nonché assegnare variabili ed eseguire altre operazioni mentre si estendono più righe:

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 assicura che 4 sia il valore predefinito del multiplier dell'argomento, se non viene dato alcun valore quando si chiama la funzione 4 è ciò che verrà usato.

Quanto sopra sono tutti esempi di funzioni con nome , così chiamate semplicemente perché sono stati dati nomi ( one , two , subtract.length , subtract.length ecc.)

Funzioni anonime

Una funzione anonima è, come suggerisce il nome, non assegnato un nome. Questo può essere utile quando la funzione fa parte di un'operazione più ampia, ma di per sé non occupa molto spazio. Un caso d'uso frequente per le funzioni anonime rientra nella famiglia di funzioni di base *apply .

Calcola il quadrato medio di radice per ogni colonna in un 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 

Creare una sequenza di step-length uno dal valore più piccolo al più grande per ogni riga in una matrice.

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

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

Una funzione anonima può anche stare in piedi da sola:

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

è equivalente a

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

Snippet di codice RStudio

Questo è solo un piccolo trucco per coloro che usano spesso funzioni auto-definite.
Scrivi "divertente" RStudio IDE e premi TAB.

inserisci la descrizione dell'immagine qui

Il risultato sarà uno scheletro di una nuova funzione.

name <- function(variables) {
        
}

Si può facilmente definire il proprio modello di frammento, come quello qui sotto

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

L'opzione è Edit Snippets nel menu Global Options -> Code .

Passando nomi di colonne come argomento di una funzione

A volte si vorrebbe passare nomi di colonne da un frame di dati a una funzione. Possono essere forniti come stringhe e utilizzati in una funzione usando [[ . Diamo un'occhiata al seguente esempio, che stampa in R console statistiche di base delle variabili selezionate:

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

Come risultato dell'esecuzione al di sopra del codice dato, i nomi delle variabili selezionate e le loro statistiche riassuntive di base (minimi, primi quantili, mediane, medie, terzi quantili e massimi) sono stampati nella console R. Il codice dset[[vars[i]]] seleziona l'elemento i- vars dall'argomento vars e seleziona una colonna corrispondente nel set di dati di input dichiarato dset . Ad esempio, dichiarando iris[["Sepal.Length"]] si stampa la colonna Sepal.Length dal set di dati iris come un vettore.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow