Narzędzia użytkownika

Narzędzia witryny


ewdrstyle

To jest stara wersja strony!


Zasady formatowania kodu R w projekcie EWD

  • Zasadniczo trzymamy się zasad z Google's R Style Guide
  • Z następującymi wyjątkami:
    1. jako operatora przypisania wartości używamy '=' a nie '<-';
    2. schematy nadawania nazw:
      1. nazwa_funkcji(),
      2. nazwaZmiennej, nazwaObiektu,
      3. nazwa_kolumny_w_ramce_danych;
    3. można wyrównywać (wcinać) kod tabulacjami, byle nie mieszać w jednym pliku z wyrównywaniem spacjami;
    4. każda tworzona funkcja - nawet jeśli chwilowo nie jest zamykana w żadnym pakiecie - powinna być dokumentowana w notacji roxygenowej (p. http://adv-r.had.co.nz/Documenting-functions.html).
  • Oraz uzupełnieniami:
    1. Przy korzystaniu z magrittr-owego operatora %>% (stosowanego w szczególności przy korzystaniu z pakietu dplyr) łamiemy linię po każdym jego zastosowaniu, chyba że w danym ciągu poleceń jest on wykorzystywany tylko raz (łączy ze sobą dokładnie dwie operacje).
    2. Przy wykonywaniu zapytań do bazy trzymamy się wytycznych.
    3. Piszemy funkcje, które nie sięgają do zmiennych, które nie zostały im przekazane jako parametry.
      • Dotyczy to również funkcji anonimowych!
        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]
        }
      • W przypadku wykorzystania funkcji takich jak subset() czy summarise() używamy funkcji get() do oznaczenia, że chcemy wykorzystać kolumnę z obrabianego data frame'a, a nie obiekt z zewnętrznego (wobec tego data frame'a) środowiska.
        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)

apply(tablica, 1, funtion(x) max(x) - min(x)) # Dobrze apply(tablica, 1, function(x){ max(x) - min(x) })</code>

  1. Unikamy tworzenia nadmiernie długich linii kodu:
    # Ź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:

    • łamiemy do nowego wiersza ciała wszelkich nietrywialnych funkcji anonimowych (tzn. zawierających coś więcej niż prostą operację arytmetyczną lub pojedyncze wywołanie funkcji, której parametrem wywołania nie jest żadna inna funkcja);
    • łamiemy do nowego wiersza argumenty wywołania funkcji, jeśli jest ich zbyt wiele;
    • za regułę kciuka przyjmujemy, że nadmiernie długa linia to linia o więcej niż 80 znakach.
ewdrstyle.1427109591.txt.gz · ostatnio zmienione: 2015/03/23 12:19 przez t.zoltak