Pertanyaan Mengapa kelas vektor kelas dari elemen vektor dan bukan vektor itu sendiri?


Saya tidak mengerti mengapa kelas vektor adalah kelas dari elemen vektor dan bukan vektor itu sendiri.

vector <- c("la", "la", "la")
class(vector) 
## [1] "character"

matrix <- matrix(1:6, ncol=3, nrow=2)
class(matrix) 
## [1] "matrix"

9
2018-06-05 05:19


asal


Jawaban:


Ini yang saya dapatkan dari ini. class terutama dimaksudkan untuk pemrograman berorientasi objek dan ada fungsi lain di R yang akan memberi Anda mod penyimpanan suatu objek (lihat ?typeof atau ?mode).

Saat melihat ?class

Banyak objek R memiliki atribut kelas, vektor karakter yang memberikan   nama kelas dari mana objek mewarisi. Jika benda itu   tidak memiliki atribut kelas, ia memiliki kelas implisit, "matriks",   "array" atau hasil dari mode (x)

Sepertinya class berfungsi sebagai berikut

  1. Ini pertama kali mencari a $class atribut

  2. Jika tidak ada, periksa apakah objek memiliki matrix atau sebuah array struktur dengan memeriksa $dim atribut (yang tidak ada dalam vector)

    2.1. jika $dim berisi dua entri, itu akan menyebutnya a matrix

    2.2. jika $dim berisi satu entri atau lebih dari dua entri, itu akan menyebutnya sebagai array

    2.3. jika $dim adalah panjang 0, ia pergi ke langkah berikutnya (mode)

  3. jika $dim adalah panjang 0 dan tidak ada $class atribut, ia melakukan mode

Jadi per teladan Anda

mat <- matrix(rep("la", 3), ncol=1)
vec <- rep("la", 3)
attributes(vec)
# NULL
attributes(mat)
## $dim
## [1] 3 1

Jadi Anda bisa melihatnya vec tidak mengandung atribut apa pun (lihat ?c atau ?as.vector untuk penjelasan)

Jadi dalam kasus pertama, class melakukan

attributes(vec)$class
# NULL
length(attributes(vec)$dim)
# 0
mode(vec)
## [1] "character"

Dalam kasus kedua, cek

attributes(mat)$class
# NULL
length(attributes(mat)$dim)
##[1] 2

Ia melihat bahwa objek memiliki dua dimensi dan ada untuk panggilan itu matrix

Untuk mengilustrasikan keduanya vec dan mat memiliki mode penyimpanan yang sama, bisa Anda lakukan

mode(vec)
## [1] "character"
mode(mat)
## [1] "character"

Anda juga dapat melihat, misalnya, perilaku yang sama dengan larik

ar <- array(rep("la", 3), c(3, 1)) # two dimensional array
class(ar)
##[1] "matrix"
ar <- array(rep("la", 3), c(3, 1, 1)) # three dimensional array
class(ar)
##[1] "array"

Jadi keduanya array dan matrix jangan menguraikan a class atribut. Mari kita periksa, misalnya, apa data.frame tidak.

df <- data.frame(A = rep("la", 3))
class(df)
## [1] "data.frame"

Dimana class mengambilnya dari?

attributes(df)    
# $names
# [1] "A"
# 
# $row.names
# [1] 1 2 3
# 
# $class
# [1] "data.frame"

Seperti yang Anda lihat, data.fram set a $class atribut, tetapi ini bisa diubah

attributes(df)$class <- NULL
class(df)
## [1] "list"

Mengapa list? Karena data.frame tidak punya $dim atribut (tidak a $class satu, karena kami hanya menghapusnya), jadi class melakukan mode(df)

mode(df)
## [1] "list"

Terakhir, untuk mengilustrasikan caranya class bekerja, kita dapat mengatur secara manual class untuk apa pun yang kita inginkan dan melihat apa yang akan memberi kita kembali

mat <- structure(mat, class = "vector")
vec <- structure(vec, class = "vector")
class(mat)
## [1] "vector"
class(vec)
## [1] "vector"

8
2018-06-05 08:40



R harus mengetahui kelas objek yang sedang Anda operasikan untuk melakukan pengiriman metode yang tepat pada objek tersebut. Tipe data atom dalam R adalah vektor, tidak ada hal seperti skalar, yaitu R menganggap satu bilangan bulat satu vektor panjang; is.vector( 1L ).

Untuk mengirim metode yang benar, R harus mengetahui datatype. Tidak banyak menggunakan mengetahui bahwa sesuatu adalah vektor, ketika bahasa Anda secara implisit vektor dan segala sesuatu dirancang untuk beroperasi pada vektor.

is.vector( list( NULL , NULL ) )
is.vector( NA )
is.vector( "a" )
is.vector( c( 1.0556 , 2L ) )

Jadi, Anda dapat mengambil nilai pengembalian class( 1L ) yang mana [1] "integer" berarti, Saya adalah vektor atom yang terdiri dari tipe integer.

Terlepas dari kenyataan bahwa di bawah tenda a matrix sebenarnya hanya sebuah vektor dengan dua atribut dimensi, R harus tahu itu adalah matriks sehingga dapat beroperasi baris-bijaksana atau kolom-bijaksana pada elemen-elemen matriks (atau secara individual pada setiap elemen subscripted tunggal). Setelah subsetting, Anda akan mengembalikan vektor dari tipe data dari elemen-elemen dalam matriks Anda, yang akan memungkinkan R mengirimkan metode yang sesuai untuk data Anda (mis. Melakukan sortpada vektor karakter atau vektor numerik);

/* from the underlying C code in /src/main/subset.c....*/
result = allocVector(TYPEOF(x), (R_xlen_t) nrs * (R_xlen_t) ncs)

Anda juga harus mencatat, bahwa sebelum menentukan kelas objek, R akan selalu memeriksa bahwa itu adalah vektor pertama, mis. dalam hal berlari is.matrix(x) pada beberapa matriks, x, R memeriksa bahwa itu adalah pertama vektor, dan kemudian memeriksa atribut dimensi. Jika atribut dimensi adalah vektor INTEGER tipe data dari LENGTH 2 itu memenuhi kondisi untuk objek yang menjadi matriks (potongan kode berikut berasal Rinlinedfuns.h dari / src / include /)

INLINE_FUN Rboolean isMatrix(SEXP s)
  495 {
  496     SEXP t;
  497     if (isVector(s)) {
  498    t = getAttrib(s, R_DimSymbol);
  499    /* You are not supposed to be able to assign a non-integer dim,
  500       although this might be possible by misuse of ATTRIB. */
  501    if (TYPEOF(t) == INTSXP && LENGTH(t) == 2)
  502        return TRUE;
  503     }
  504     return FALSE;
  505 }

#  e.g. create an array with height and width....  
a <- array( 1:4 , dim=c(2,2) )

#  this is a matrix!
class(a)
#[1] "matrix"

# And the class of the first column is an atomic vector of type integer....
class(a[,1])
[1] "integer"

6
2018-06-05 07:44



Dalam Definisi bahasa R, ada enam tipe dasar vektor, salah satunya adalah "character". Sebenarnya tidak ada tipe "vektor" dasar, tetapi enam jenis vektor yang berbeda jenisnya.

Di samping itu, Matriks adalah tipe struktur data.


4
2018-06-05 06:00



Inilah diagram terbaik yang saya temukan yang menjabarkan hirarki kelas yang digunakan oleh class fungsi:

rpy2 robjects package

Meskipun nama kelas tidak sesuai persis dengan hasil R class berfungsi, saya percaya hirarki pada dasarnya akurat. Kunci jawaban Anda adalah bahwa class fungsi hanya memberikan kelas root dalam hierarki.

Anda akan melihatnya Vector aku s tidak kelas root. Kelas root untuk contoh Anda akan menjadi StrVector, yang sesuai dengan "character" kelas, kelas untuk vektor dengan elemen karakter. Sebaliknya, Matrix itu sendiri adalah kelas akar; karenanya, kelasnya adalah "matrix".


2
2018-02-16 22:47