Jakie jest dobre zastosowanie funkcji „komentowania” w języku R?

35

Właśnie odkryłem commentfunkcję w R. Przykład:

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

Po raz pierwszy przyszedłem przez tę funkcję i zastanawiałem się, jakie są jej typowe / użyteczne zastosowania. Ponieważ wyszukiwanie „komentarza R” w google i znalezienie odpowiednich wyników jest dość trudne, miałem nadzieję, że ktoś tutaj podzieli się swoim doświadczeniem.

Tal Galili
źródło
3
Nie sądzę, że to pytanie naprawdę musi być CW. To granica, ale nie jest tak źle.
csgillespie
świetna informacja! (pakiet szeregów czasowych „xts” ma podobną funkcjonalność metadanych.)
Doug
2
To pytanie zostało zasugerowane na zakończenie: jeśli pytanie jest szeroko interpretowane (i zauważ, że prawie żadna z odpowiedzi nie jest specyficzna dla R), tak naprawdę jest to pytanie o to, kiedy i dlaczego chciałbyś nazwać kolumny danych. Tego rodzaju kwestia zarządzania danymi jest wyraźnie regularną częścią praktyki statystycznej, więc prawdopodobnie dotyczy tego tematu.
Silverfish

Odpowiedzi:

15

Na drugim miejscu @Gavin, Frank Harrell opracował wydajne sposoby obsługi danych data.frame w R w swoim pakiecie Hmisc . Na przykład funkcje label()i units()pozwalają dodawać dedykowane atrybuty do obiektów R. Uważam je za bardzo przydatne przy tworzeniu podsumowania data.frame (np. Z describe()).

Innym przydatnym sposobem użycia takiego dodatkowego atrybutu jest zastosowanie znacznika czasu w zestawie danych. Dodam także atrybut takich rzeczy jak losowe ziarno, liczba foldów (gdy używam k-kold lub LOO cross-validation).

chl
źródło
14

-1-1

Uważam, że to comment()dobry sposób na dołączenie tych informacji do ramki danych do wykorzystania w przyszłości.

Przywróć Monikę - G. Simpson
źródło
2
Standardowym rozwiązaniem jest uwzględnienie pola dla jednostek miary, aby komputer mógł zostać zaprogramowany do konwersji wszystkich wyników liczbowych na wspólne (specyficzne dla parametrów) jednostki. Zakopanie tych kluczowych informacji w komentarzach utrudnia lub uniemożliwia wdrożenie tej możliwości.
whuber
2
@ Whuber, ale R nie ma takiej konstrukcji w swoich obiektach podstawowych i nie chcę pisać całego stosu metod S4 do odtwarzania ramek danych, które przenoszą informacje o jednostce. Zauważ, że comment()to nie komentarze w kodzie. Do obiektu przypisuje się określony atrybut, którym może być wektor, jeden element na kolumnę ramki danych zawierającej informacje o jednostkach. Łatwo jest wyodrębnić te informacje, więc nie rozumiem, dlaczego wdrożenie czegoś byłoby trudne lub niemożliwe?
Przywróć Monikę - G. Simpson,
1
Gavin, sugeruję coś znacznie prostszego. Na przykład, jeśli czasami stężenia selenu są rejestrowane w mg / l, a innym razem jako meq / l, możesz łatwo wybrać wszystkie przypadki tego ostatniego i pomnożyć stężenie przez odpowiedni współczynnik, aby przeliczyć je na mg / l. Jednak - może to być przyczyną twojego sprzeciwu R- zdecydowanie nie jest właściwym miejscem do utrzymywania baz danych i wykonywania tego typu procesów, nawet jeśli jest w stanie to zrobić. Najlepszym uzupełnieniem jest dobry system zarządzania bazą danych do takich prac.
whuber
4
Zgadzam się! comment()i in. są przydatne w przypadku notatek i informacji ad hoc, ale do obsługi danych na większą skalę wymagany jest odpowiedni system. Co ciekawe, musimy zająć się tym teraz w ramach grupy badawczej i doradztwa, dla których pracuję w odniesieniu do naszych danych chemicznych i potrzebuję wprowadzić je do odpowiedniej bazy danych.
Przywróć Monikę - G. Simpson,
8

Podobne udogodnienia istnieją w innych pakietach, takich jak polecenie -notes- w programie Stata . Używamy tego do udokumentowania pełnych szczegółów zmiennej, np. Szczegółów testu dla pomiaru biochemicznego lub dokładnego sformułowania pytania zadawanego dla danych z kwestionariusza. Jest to często zbyt wiele informacji dla nazwy lub etykiety zmiennej, z których jedna lub obie są wyświetlane w wynikach każdej analizy dotyczącej zmiennej, a zatem najlepiej jest je odpowiednio skrócić.

jeden przystanek
źródło
4

Jedną z rzeczy, które często robię, jest śledzenie poleceń używanych do generowania danych i obiektów, i uważam, że komentarz jest przydatnym narzędziem do tego.

„Matched.call.data” i „generate.command.string” załatwią sprawę. Nie jest idealny, ale pomocny i służy do „comment ()”. :)

# 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] )
Thell
źródło
2

Pozwólcie, że zasugeruję moje ogólne rozwiązanie do zarządzania obiektami w repopakiecie R: Za jego pomocą możesz przypisać każdej zmiennej długą nazwę, opis, zestaw tagów, zdalny adres URL, relacje zależności, a także dołączyć liczby lub ogólne pliki zewnętrzne. Na przykład kod źródłowy może być przechowywany jako element repozytorium i dołączany do wytwarzanych przez niego zasobów. Znajdź najnowszą stabilną wersję CRAN ( install.packages("repo")) lub najnowszą wersję github . Krótki przegląd tutaj . Mam nadzieję, że to pomoże.

Francesco Napolitano
źródło