Tryb, klasa i typ obiektów R.

39

Zastanawiałem się, jakie są różnice między trybem, klasą i typem R obiektów? Typ obiektu R można uzyskać za pomocą funkcji typeof (), mode by mode () i class by class ().

Jakieś inne podobne funkcje i koncepcje, za którymi tęskniłem?

Dziękuję i pozdrawiam!

Tim
źródło
2
str (zmienna) jest twoim najlepszym przyjacielem.
Brandon Bertelsen
2
Zobacz także R: Pytanie o typy i klasy zmiennych dotyczące przepełnienia stosu.
Lew

Odpowiedzi:

21

class()Służy do zdefiniowania / zidentyfikowania co „typ” dany przedmiot jest z punktu widzenia programowania obiektowego w R. więc dla

> x <- 1:3
> class(x)
[1] "integer"

zostanie użyta dowolna funkcja ogólna, która ma metodę „liczby całkowitej”.

typeof()podaje „typ” obiektu z punktu widzenia R., natomiast mode()podaje „typ” obiektu z punktu widzenia Beckera, Chambersa i Wilksa (1988). Ten ostatni może być bardziej kompatybilny z innymi implementacjami S zgodnie z instrukcją R Language Definition .

Prawdopodobnie błądziłbym po stronie używania typeof()w większości przypadków, chyba że byłoby to do przekazywania obiektów R do skompilowanego kodu, gdzie storage.mode()będzie to przydatne.

Jest to użytecznie omówione w Definicji języka R w powiązaniu z powyższym.

Przywróć Monikę - G. Simpson
źródło
3
Dlaczego jest tak wiele punktów widzenia? Nie widzę żadnych korzyści, tylko zamieszanie.
smwikipedia,
1
@smwikipedia, ponieważ R ma dziedzictwo, które obejmuje S-Plus i S, a ten drugi język ewoluował z czasem. Ponadto istnieje potrzeba rozróżnienia między obiektami, które użytkownicy mogą tworzyć, a typami obiektów podstawowych.
Przywróć Monikę - G. Simpson
@smwikipedia, bo tak właśnie jest R. Z tego samego powodu, dla którego mamy <-i =do przypisywania zmiennych.
Andre Terra,
9

Od: https://www.mail-archive.com/[email protected]/msg17169.html :

„tryb” to wzajemnie wykluczająca się klasyfikacja obiektów według ich podstawowej struktury. Tryby „atomowy” są numeryczne, złożone, znakowe i logiczne. Obiekty rekurencyjne mają tryby takie jak „lista” lub „funkcja” lub kilka innych. Obiekt ma jeden i tylko jeden tryb.

„klasa” jest właściwością przypisaną do obiektu, która określa, w jaki sposób działają z nim funkcje ogólne. To nie wyklucza się wzajemnie. Jeśli do obiektu nie przypisano żadnej konkretnej klasy, takiej jak prosty wektor numeryczny, jego klasa jest zwykle taka sama jak jego tryb, zgodnie z konwencją.

Zmiana trybu obiektu jest często nazywana „przymusem”. Tryb obiektu może się zmienić bez konieczności zmiany klasy.

niedźwiedź
źródło
1

Główną różnicą między klasą a typofem jest to, że użytkownik może zdefiniować pierwszy, ale typ nie. Na przykład zdefiniuj listę

> x<-list("a",c(1,2))

> # x is a list
> class(x)
[1] "list"
> # class can be user defined
> class(x)<-"newclass"
> class(x)
[1] "newclass"

> typeof(x)
[1] "list"
# you cannot assign a different type using typeof()
> typeof(x)<-"newclass"
Error in typeof(x) <- "newclass" : could not find function "typeof<-" 

Nadanie określonej nazwy klasy obiektowi zdefiniowanemu przez użytkownika jest bardzo przydatne do pisania programów. Pozwala oznaczać obiekty zdefiniowane przez użytkownika w podobny sposób, jak dzieje się w obiektowych językach programowania.

Carlos Ramírez Alvarez
źródło
Zgodnie z Rdokumentacją typeofi classtwierdzenie o „głównej różnicy” jest nieprawidłowe. classjest atrybutem obiektu, który można przypisać niezależnie od jego trybu pamięci wewnętrznej, natomiast „typeof określa typ (R wewnętrzny) lub tryb pamięci dowolnego obiektu”. Jedna opisuje cechę logiczną, a druga cechę fizyczną obiektu.
whuber