Po napisaniu dziesiątki tysięcy linii kodu w obu językach, R jest po prostu o wiele bardziej idiosynkratyczny i mniej spójny niż w Pythonie. Naprawdę miło jest robić szybkie wątki i badać na małym i średnim zestawie danych, głównie dlatego, że jego wbudowany obiekt danych jest ładniejszy niż odpowiednik numpy/scipy, ale znajdziesz wszystkie rodzaje dziwności, robiąc rzeczy bardziej skomplikowane niż jedna wkładka. Moja rada to użycie rpy2 (która niestety ma znacznie gorszy interfejs niż jego poprzednik, rpy) i po prostu robić tak mało jak to możliwe w R z resztą w Pythonie.
Na przykład rozważmy następujący kod matrix:
> u = matrix(1:9,nrow=3,ncol=3)
> v = u[,1:2]
> v[1,1]
[2] 1
> w = u[,1]
> w[1,1]
Error in w[1, 1] : incorrect number of dimensions
Jak to nie? Powodem jest to, że jeśli wybierzesz submatrix z macierzy, która ma tylko jedną kolumnę wzdłuż danej osi, R "pomocnie" upuszcza tę kolumnę i zmienia typ zmiennej. Więc w jest wektorem liczb zamiast matrycy:
> class(v)
[1] "matrix"
> class(u)
[1] "matrix"
> class(w)
[1] "integer"
Aby tego uniknąć, trzeba rzeczywiście zdać niejasne parametru kluczowego:
> w2 = u[,1,drop=FALSE]
> w2[1,1]
[3] 1
> class(w2)
[1] "matrix"
Istnieje wiele zakamarków w tym stylu. Najlepszym przyjacielem na początku będzie introspekcja i narzędzia pomocy online, takie jak str
, class
, example
i oczywiście help
. Sprawdź również przykładowy kod na R Graph Gallery oraz w książce Ripley'a Modern Applied Statistics with S-Plus.
EDIT: Oto kolejny świetny przykład z czynników.
> xx = factor(c(3,2,3,4))
> xx
[1] 3 2 3 4
Levels: 2 3 4
> yy = as.numeric(xx)
> yy
[1] 2 1 2 3
Święta krowa! Przekształcenie czegoś z czynnika z powrotem na numeryczne nie spowodowało konwersji, którą myślałeś. Zamiast tego robi to na wewnętrznym, wyliczonym typie czynnika. Jest to źródło trudnych do znalezienia błędów dla osób, które nie są tego świadome, ponieważ wciąż zwracają liczby całkowite i faktycznie będą działać w danym czasie (gdy dane wejściowe są już uporządkowane numerycznie).
To jest to, co rzeczywiście trzeba zrobić
> as.numeric(levels(xx))[xx]
[1] 3 2 3 4
Tak, na pewno, że fakt, znajduje się na stronie factor
pomóc, ale tylko tam wylądować, kiedy straciliśmy kilka godzin do tego błędu. Jest to kolejny przykład tego, jak R nie robi tego, co zamierzamy. Bądź bardzo, bardzo ostrożny przy wszystkim, co wymaga konwersji typu lub dostępu do elementów tablic i list.
'v [3]' w pythonie daje czwarty element sekwencji. w danym przypadku będzie to "4". – SilentGhost
@SilentGhost: off course, naprawił błąd. – BioGeek
Tytuł nie odzwierciedla dokładnie tutaj pytania - to nie są "pułapki w R", to tylko podstawowe różnice między dwoma różnymi językami. I tak, v [-1] nie "usuwa elementu" z indeksem 1, zwraca nowy wektor z każdym elementem oprócz pierwszego. – mdsumner