R Language
Pisanie funkcji w języku R.
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.
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.