Szukaj…


Nazwane funkcje

R jest pełen funkcji, jest to przecież funkcjonalny język programowania , ale czasami precyzyjna funkcja, której potrzebujesz, nie jest dostępna w zasobach Base. Można sobie wyobrazić instalację pakietu zawierającego tę funkcję, ale może twoje wymagania są tak szczegółowe, że żadna z gotowych funkcji nie pasuje do rachunku? Następnie masz możliwość zrobienia własnego.

Funkcja może być bardzo prosta, do tego stopnia, że jest prawie bezcelowa. Nie trzeba nawet argumentować:

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

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

Pomiędzy nawiasami klamrowymi { } jest właściwa funkcja. Tak długo, jak możesz zmieścić wszystko w jednym wierszu, nie są one ściśle potrzebne, ale mogą być przydatne do utrzymania porządku.

Funkcja może być bardzo prosta, ale bardzo specyficzna. Ta funkcja przyjmuje jako wektor wejściowy ( vec w tym przykładzie) i wysyła ten sam wektor o długości wektora (w tym przypadku 6) odejmowanej od każdego z elementów wektora.

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

Zauważ, że length() sam w sobie jest wstępnie dostarczoną (tj. Podstawową ) funkcją. Oczywiście możesz użyć wcześniej utworzonej przez siebie funkcji w ramach innej samodzielnie wykonanej funkcji, a także przypisać zmienne i wykonać inne operacje, rozciągając się na kilka wierszy:

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 upewnia się, że 4 jest domyślną wartością multiplier argumentów, jeśli przy wywołaniu funkcji 4 nie zostanie podana żadna wartość.

Powyżej są wszystkie przykłady nazwanych funkcji, tak zwanych po prostu dlatego, że nadano im nazwy ( one , two , subtract.length . subtract.length itp.)

Funkcje anonimowe

Funkcja anonimowa, jak sama nazwa wskazuje, nie ma przypisanej nazwy. Może to być przydatne, gdy funkcja jest częścią większej operacji, ale sama w sobie nie zajmuje wiele miejsca. Jeden częsty przypadek użycia anonimowych funkcji znajduje się w rodzinie *apply Apply funkcji Base.

Oblicz średni kwadrat pierwiastkowy dla każdej kolumny w 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 

Utwórz sekwencję o długości kroku od najmniejszej do największej wartości dla każdego wiersza w macierzy.

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

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

Anonimowa funkcja może również działać samodzielnie:

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

jest równa

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

Fragmenty kodu RStudio

To tylko mały hack dla tych, którzy często używają samodzielnie zdefiniowanych funkcji.
Wpisz „fun” RStudio IDE i naciśnij TAB.

wprowadź opis zdjęcia tutaj

Rezultatem będzie szkielet nowej funkcji.

name <- function(variables) {
        
}

Można łatwo zdefiniować własny szablon fragmentu kodu, tj. Taki jak ten poniżej

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

Opcja to Edit Snippets w menu Global Options -> Code .

Przekazywanie nazw kolumn jako argumentów funkcji

Czasami chciałoby się przekazać nazwy kolumn z ramki danych do funkcji. Mogą być dostarczone jako ciągi znaków i użyte w funkcji przy użyciu [[ . Rzućmy okiem na następujący przykład, który wyświetla na konsoli R podstawowe statystyki wybranych zmiennych:

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

W wyniku uruchomienia powyższego kodu nazwy wybranych zmiennych i ich podstawowe statystyki podsumowujące (minima, pierwsze kwantyle, mediany, średnie, trzecie kwantyle i maksima) są drukowane w konsoli R. Kod dset[[vars[i]]] zaznaczane i-ty element z argumentu vars i wybiera odpowiednią kolumnę deklarowanej zbioru danych wejściowych dset . Na przykład, zadeklarowanie samej iris[["Sepal.Length"]] spowoduje wydrukowanie kolumny Sepal.Length z zestawu danych iris jako wektora.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow