Apa gunanya fungsi 'komentar' dalam R?


35

Saya baru saja menemukan commentfungsi di R. Contoh:

x <- matrix(1:12, 3,4)
comment(x) <- c("This is my very important data from experiment #0234",
                "Jun 5, 1998")
x
comment(x)

Ini adalah pertama kalinya saya datang dengan fungsi ini dan bertanya-tanya apa kegunaan umum / berguna dari itu. Karena cukup sulit untuk mencari "Komentar R" di google dan menemukan hasil yang relevan, saya berharap seseorang di sini dapat berbagi dengan pengalamannya.


3
Saya tidak berpikir bahwa pertanyaan ini benar-benar perlu menjadi CW. Ini batas, tapi tidak terlalu buruk.
csgillespie

informasi hebat! (paket time series 'xts' memiliki fungsi metadata yang serupa.)
doug

2
Pertanyaan ini telah disarankan untuk ditutup: jika pertanyaan tersebut ditafsirkan secara luas (dan perhatikan bahwa tidak ada jawaban yang spesifik untuk R), ini benar-benar pertanyaan tentang kapan dan mengapa seseorang ingin memberi label pada kolom data. Masalah manajemen data semacam ini jelas merupakan bagian rutin dari praktik statistik, jadi bisa dibilang on-topic di sini.
Silverfish

Jawaban:


15

Untuk @Gavin kedua, Frank Harrell telah mengembangkan cara-cara efisien untuk menangani data.frame beranotasi dalam R dalam paket Hmisc- nya . Misalnya, label()dan units()fungsi memungkinkan untuk menambahkan atribut khusus ke objek R. Saya menemukan mereka sangat berguna saat membuat ringkasan data.frame (misalnya, dengan describe()).

Cara lain yang bermanfaat untuk menggunakan atribut ekstra tersebut adalah dengan menerapkan stempel waktu pada kumpulan data. Saya juga menambahkan atribut untuk hal-hal seperti seed acak, nomor lipat (ketika saya menggunakan k-kold atau LOO cross-validation).


14

-1-1

Saya akan melihat comment()cara yang bagus untuk melampirkan informasi ini ke kerangka data untuk referensi di masa mendatang.


2
Solusi standar adalah dengan memasukkan bidang untuk unit pengukuran, sehingga komputer dapat diprogram untuk mengubah semua hasil numerik menjadi unit umum (khusus parameter). Mengubur informasi penting ini dalam komentar membuat penerapan kemampuan ini sulit atau tidak mungkin.
whuber

2
@whuber tetapi R tidak memiliki konstruksi seperti itu di objek dasar dan saya tidak ingin menulis setumpuk metode S4 untuk mereproduksi bingkai data yang membawa sekitar info unit. Perhatikan bahwa comment()ini bukan komentar dalam kode. Ini melampirkan atribut spesifik ke objek yang bisa menjadi vektor, satu elemen per kolom dari frame data yang berisi informasi unit. Mudah untuk mengekstrak info ini sehingga saya tidak melihat mengapa menerapkan sesuatu akan sulit atau tidak mungkin?
Reinstate Monica - G. Simpson

1
Gavin, saya menyarankan sesuatu yang lebih sederhana. Misalnya, jika kadang-kadang konsentrasi selenium dicatat dalam mg / L dan kali lain sebagai meq / L, Anda dapat dengan mudah memilih semua instance dari yang terakhir dan mengalikan konsentrasi dengan faktor yang tepat untuk mengubahnya menjadi mg / L. Namun - ini mungkin menjadi sumber keberatan Anda - Rjelas bukan tempat yang tepat untuk memelihara database dan melakukan proses jenis ini, meskipun itu mampu melakukannya. Yang terbaik adalah dilengkapi dengan sistem manajemen basis data yang baik untuk pekerjaan seperti itu.
whuber

4
Amin untuk itu! comment()et al berguna untuk catatan dan info ad hoc, tetapi sistem yang tepat diperlukan untuk penanganan data skala besar. Menariknya kita harus mengatasi ini sekarang dalam kelompok penelitian dan konsultasi tempat saya bekerja sehubungan dengan data kimia kita dan perlu memasukkannya ke dalam basis data yang tepat.
Reinstate Monica - G. Simpson

8

Fasilitas serupa ada di paket lain, seperti perintah -notes- di Stata . Kami menggunakan ini untuk mendokumentasikan detail lengkap dari suatu variabel, mis. Rincian pengujian untuk pengukuran biokimia, atau kata-kata yang tepat dari pertanyaan yang diajukan untuk data kuesioner. Ini sering terlalu banyak info untuk nama variabel atau label, satu atau keduanya ditampilkan dalam output dari setiap analisis yang melibatkan variabel dan karena itu sebaiknya disimpan cukup singkat.


4

Salah satu hal yang sering saya lakukan adalah melacak perintah yang digunakan untuk menghasilkan data dan objek, dan telah menemukan komentar sebagai alat yang berguna untuk ini.

The 'matched.call.data' dan 'menghasilkan.command.string' lakukan triknya. Tidak sempurna, tetapi bermanfaat dan digunakan untuk 'komentar ()'. :)

# Comments only accept strings...
# Substituting the escaped quotes ('\"') makes it prettier.
generate.command.string <- function( matched.call.data )
{
  command.string <- as.character( bquote( .( list( matched.call.data ) ) ) )
  sapply( bquote( .(command.string) ),
                  USE.NAMES=FALSE,
                  function( x )
                    gsub( "\\\"", "\'", as.list( match.call() )$x )[[2]] )
}

# Some generating function...
generate.matrix <- function( nrows, ncols, data=NA ) {
  # Some generated object
  mat <- matrix( data= data, nrow= nrows, ncol= ncols )

  matched.call.data <- do.call( "call",
                                c( list( as.character( match.call()[[1]] ) ),
                                lapply( as.list( match.call() )[-1], eval ) ) )
  comment( mat ) <- c( Generated= date(),
                       Command = generate.command.string( matched.call.data ) )

  mat
}

# Generate an object with a missing argument.
emptyMat <- generate.matrix( nrows=2, ncols=2 )
comment( emptyMat )

# Generate without formally stating arguments.
dataMat <- generate.matrix( 2, 2, sample(1:4, 4, replace= TRUE ) )
comment( dataMat )

# And with a longer command.
charMat <- generate.matrix( 3, 3,
                  c( 'This', 'is', 'a', 'much', 'longer',
                     'argument', 'section', 'that', 'wraps') )
comment( charMat )

# And with a variable.
myData <- c( 'An', 'expanded', 'command', 'argument')
charMat2 <- generate.matrix( 2, 2, myData )
comment( charMat2 )

# Create a new object from an original command.
Sys.sleep(1)
emptyMat2 <- eval( parse( text= comment( emptyMat )[['Command']] ) )
dataMat2 <- eval( parse( text= comment( emptyMat )[['Command']] ) )

# Check equality of the static matrices.
identical( emptyMat, emptyMat2 )

# The generation dates are different.
all.equal( emptyMat, emptyMat2, check.attributes= FALSE )
comment( emptyMat )['Generated'] <- NA
comment( emptyMat2 )['Generated'] <- NA
identical( emptyMat, emptyMat2 )

# Command argument structure still works too.
str( as.list( match.call(
  generate.matrix, parse( text=comment( charMat2 )[[ 'Command' ]] ) ) )[-1] )

2

Izinkan saya menyarankan solusi umum saya ke manajemen objek di R: repopaket. Dengan menggunakannya, Anda dapat menetapkan setiap nama variabel, nama panjang, deskripsi, satu set tag, url jarak jauh, hubungan ketergantungan dan juga melampirkan gambar atau file eksternal umum. Misalnya, kode sumber dapat disimpan sebagai item repositori dan dilampirkan ke sumber daya yang dihasilkannya. Temukan rilis stabil terbaru di CRAN ( install.packages("repo")) atau pengembangan terbaru di github . Tinjauan singkat di sini . Semoga ini bisa membantu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.