wektor = c('a', 'b', c') # Źle wynik = apply(1:3, function(x){ wektor[x] }) # Dobrze wynik = apply(1:3, function(x, y){ y[x] }, wektor) # Też dobrze, działa równie szybko wynik = c() for(i in 1:3){ wynik[i] = wektor[i] }
dane = data.frame(a = rep(1:2, 5), b = 1:10) # Źle agr = ddply(dane, ~a, summarise, sr = mean(b)) podzb = subset(dane, a == 1) # Dobrze agr = ddply(dane, ~a, summarise, sr = mean(get("b"))) podzb = subset(dane, get("a") == 1)
# Źle apply(tablica, 1, funtion(x) max(x) - min(x)) # Dobrze apply(tablica, 1, function(x){ max(x) - min(x) })
# Źle sapply(lista, function(x){ apply(x, c(1, 2), function(y){ rowSums(y) / sum(y) }) }) # Dobrze sapply(lista, function(x){ apply(x, c(1, 2), function(y){ rowSums(y) / sum(y) }) }) # Źle zupelnie_prosta_funkcja(lista[[1]]$kolumna[filtr], apply(dane, c(1, 2), function(x){ mean(x) - sd(x) })) # Dobrze arg1 = lista[[1]]$kolumna[filtr] arg2 = apply(dane, c(1, 2), function(x){ mean(x) - sd(x) }) zupelnie_prosta_funkcja(arg1, arg2) # Źle zlozona_funkcja(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14) # Dobrze zlozona_funkcja( arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14 )
W szczególności:
# Źle dane = select(dane, kolumna1, kolumna2) %>% filter(kolumna2 > 0) %>% summarise(koluma3 = kolumna1 / kolumna2) # Dobrze dane = select(dane, kolumna1, kolumna2) %>% filter(kolumna2 > 0) %>% summarise(koluma3 = kolumna1 / kolumna2)
Spośród opisanych niżej metod preferowane jest wykorzystanie funkcji pakietu assertive w rozsądnym połączeniu z użyciem warunków do obsługi bardziej skomplikowanych sytuacji (w szczególności ostrzeżeń i konwersji typów, jeśli funkcja takowe wykonuje).
moja_funkcja = function(x) { if (any(is.na(x)) { stop("Argument 'x' nie może zawierać braków danych!") } else { return(x) } }
moja_funkcja = function(x) { stopifnot(all(!is.na(x)) return(x) }
Przewodnik po funkcjach pakietu assertive.
moja_funkcja = function(x) { assert_all_are_not_na(x) return(x) }