R Language
Zmienne
Szukaj…
Zmienne, struktury danych i podstawowe operacje
W R obiekty danych są manipulowane przy użyciu nazwanych struktur danych. Nazwy obiektów można nazwać „zmiennymi”, chociaż termin ten nie ma określonego znaczenia w oficjalnej dokumentacji R. W nazwach R rozróżniana jest wielkość liter i mogą one zawierać znaki alfanumeryczne ( az
, Az
, 0-9
), kropkę / kropkę ( .
) I podkreślenie ( _
). Aby utworzyć nazwy struktur danych, musimy przestrzegać następujących zasad:
Nazwiska zaczynające się od cyfry lub znaku podkreślenia (np
1a
) lub nazwy, które są ważne wyrażenia liczbowe (np.11
), albo imiona z myślnika ( „-”) lub pomieszczenia mogą być stosowane tylko wtedy, gdy są notowane:`1a`
i`.11`
. Nazwy zostaną wydrukowane za pomocą wstecznych:list( '.11' ="a") #$`.11` #[1] "a"
Wszystkie inne kombinacje znaków alfanumerycznych, kropek i znaków podkreślenia mogą być używane dowolnie, gdy odniesienie z odwrotnymi znakami lub bez wskazuje na ten sam obiekt.
Nazwy, które zaczynają się od
.
są uważane za nazwy systemowe i nie zawsze są widoczne za pomocą funkcjils()
.
Nie ma ograniczenia liczby znaków w nazwie zmiennej.
Niektóre przykłady poprawnych nazw obiektów są: foobar
, foo.bar
, foo_bar
, .foobar
W R zmiennym przypisuje się wartości za pomocą operatora przypisania niewidzialności <-
. Operator =
może być również użyty do przypisania wartości do zmiennych, jednak jego właściwe użycie to skojarzenie wartości z nazwami parametrów w wywołaniach funkcji. Pamiętaj, że pominięcie spacji wokół operatorów może powodować zamieszanie dla użytkowników. Wyrażenie a<-1
jest analizowane jako przypisanie ( a <- 1
), a nie jako logiczne porównanie ( a < -1
).
> foo <- 42
> fooEquals = 43
Więc foo
ma przypisaną wartość 42
. Wpisanie foo
w konsoli wyświetli 42
, a wpisanie fooEquals
spowoduje wyświetlenie 43
.
> foo
[1] 42
> fooEquals
[1] 43
Następujące polecenie przypisuje wartość do zmiennej o nazwie x
i drukuje wartość jednocześnie:
> (x <- 5)
[1] 5
# actually two function calls: first one to `<-`; second one to the `()`-function
> is.function(`(`)
[1] TRUE # Often used in R help page examples for its side-effect of printing.
Możliwe jest również przypisywanie zmiennych za pomocą ->
.
> 5 -> x
> x
[1] 5
>
Rodzaje struktur danych
W R. nie ma typów danych skalarnych. Wektory długości 1 działają jak skalary.
- Wektory: Wektory atomowe muszą być ciągiem obiektów tej samej klasy: sekwencją liczb, sekwencją logiki lub sekwencją znaków.
v <- c(2, 3, 7, 10)
,v2 <- c("a", "b", "c")
są wektorami. - Macierze: Macierz liczb, logiczna lub znaków.
a <- matrix(data = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), nrow = 4, ncol = 3, byrow = F)
. Podobnie jak wektory, macierz musi być wykonana z elementów tej samej klasy. Aby wyodrębnić elementy z macierzy, należy podać wiersze i kolumny:a[1,2]
zwraca[1] 5
, czyli element z pierwszego wiersza, drugiej kolumny. - Listy: konkatenacja różnych elementów
mylist <- list (course = 'stat', date = '04/07/2009', num_isc = 7, num_cons = 6, num_mat = as.character(c(45020, 45679, 46789, 43126, 42345, 47568, 45674)), results = c(30, 19, 29, NA, 25, 26 ,27) )
. Wyodrębnianie elementów z listy można wykonać według nazwy (jeśli lista ma nazwę) lub według indeksu. W podanym przykładziemylist$results
imylist[[6]]
uzyskują ten sam element. Ostrzeżenie: jeśli spróbujeszmylist[6]
, R nie da ci błędu, ale wyodrębni wynik jako listę. Chociaż lista odtwarzaniamylist[[6]][2]
jest dozwolona (daje 19), lista odtwarzaniamylist[6][2]
wyświetla błąd. - data.frame: obiekt z kolumnami, które są wektorami o równej długości, ale (prawdopodobnie) różnych typach. Nie są matrycami.
exam <- data.frame(matr = as.character(c(45020, 45679, 46789, 43126, 42345, 47568, 45674)), res_S = c(30, 19, 29, NA, 25, 26, 27), res_O = c(3, 3, 1, NA, 3, 2, NA), res_TOT = c(30,22,30,NA,28,28,27))
. Kolumny można odczytać według nazwyexam$matr
,exam[, 'matr']
lub według indeksuexam[1]
,exam[,1]
. Rzędy można również odczytać wedługexam['rowname', ]
nazwyexam['rowname', ]
lubexam[1,]
indeksowegoexam[1,]
. Ramki danych to tak naprawdę listy o określonej strukturze (komponenty rownames-atrybut i elementy o równej długości)
Typowe operacje i porady ostrzegawcze
Domyślne operacje wykonywane są element po elemencie. Zobacz ?Syntax
reguł pierwszeństwa operatora. Większość operatorów (i może inne funkcje w bazie R) mają reguły recyklingu, które dopuszczają argumenty o nierównej długości. Biorąc pod uwagę te obiekty:
Przykładowe obiekty
> a <- 1
> b <- 2
> c <- c(2,3,4)
> d <- c(10,10,10)
> e <- c(1,2,3,4)
> f <- 1:6
> W <- cbind(1:4,5:8,9:12)
> Z <- rbind(rep(0,3),1:3,rep(10,3),c(4,7,1))
Niektóre operacje wektorowe
> a+b # scalar + scalar
[1] 3
> c+d # vector + vector
[1] 12 13 14
> a*b # scalar * scalar
[1] 2
> c*d # vector * vector (componentwise!)
[1] 20 30 40
> c+a # vector + scalar
[1] 3 4 5
> c^2 #
[1] 4 9 16
> exp(c)
[1] 7.389056 20.085537 54.598150
Niektóre operacje wektorowe Ostrzeżenia!
> c+e # warning but.. no errors, since recycling is assumed to be desired.
[1] 3 5 7 6
Warning message:
In c + e : longer object length is not a multiple of shorter object length
R sumuje, co może, a następnie ponownie wykorzystuje krótszy wektor do wypełnienia pustych pól ... Ostrzeżenie zostało wydane tylko dlatego, że dwa wektory mają długości, które nie są dokładnie wielokrotnościami. c + f # bez żadnego ostrzeżenia.
Niektóre operacje na macierzach Ostrzeżenie!
> Z+W # matrix + matrix #(componentwise)
> Z*W # matrix* matrix#(Standard product is always componentwise)
Aby użyć macierzy, należy pomnożyć: V% *% W
> W + a # matrix+ scalar is still componentwise
[,1] [,2] [,3]
[1,] 2 6 10
[2,] 3 7 11
[3,] 4 8 12
[4,] 5 9 13
> W + c # matrix + vector... : no warnings and R does the operation in a column-wise manner
[,1] [,2] [,3]
[1,] 3 8 13
[2,] 5 10 12
[3,] 7 9 14
[4,] 6 11 16
Zmienne „prywatne”
Kropka wiodąca w nazwie zmiennej lub funkcji w R jest powszechnie używana do oznaczenia, że zmienna lub funkcja ma być ukryta.
Deklarując następujące zmienne
> foo <- 'foo'
> .foo <- 'bar'
A następnie użycie funkcji ls
do wyświetlenia obiektów pokaże tylko pierwszy obiekt.
> ls()
[1] "foo"
Jednak przekazanie all.names = TRUE
do funkcji spowoduje wyświetlenie zmiennej „private”
> ls(all.names = TRUE)
[1] ".foo" "foo"