Was ist eine gute Verwendung der 'Kommentar'-Funktion in R?

35

Ich habe gerade die commentFunktion in R entdeckt. Beispiel:

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

Dies ist das erste Mal, dass ich diese Funktion besuche und mich frage, welche häufigen / nützlichen Verwendungen es gibt. Da es ziemlich schwierig ist, in Google nach "R comment" zu suchen und relevante Ergebnisse zu finden, hatte ich gehofft, dass jemand hier seine Erfahrungen mitteilt.

Tal Galili
quelle
3
Ich denke nicht, dass diese Frage wirklich ein CW sein muss. Es ist grenzwertig, aber es ist nicht so schlimm.
csgillespie
Tolle Informationen! (Das Zeitreihenpaket 'xts' verfügt über eine ähnliche Metadatenfunktionalität.)
Doug
2
Diese Frage wurde zum Schließen vorgeschlagen: Wenn die Frage breit ausgelegt ist (und beachte, dass so gut wie keine der Antworten R-spezifisch ist), ist dies wirklich eine Frage, wann und warum man Datenspalten kennzeichnen möchte. Diese Art von Datenmanagementproblemen ist eindeutig ein fester Bestandteil der statistischen Praxis und wird hier wohl thematisiert.
Silverfish

Antworten:

15

Zum zweiten Mal hat Frank Harrell in seinem Hmisc- Paket effiziente Methoden entwickelt, um mit Anmerkungen versehene data.frame-Dateien in R zu verarbeiten . Mit den Funktionen label()und units()können Sie beispielsweise R-Objekten dedizierte Attribute hinzufügen. Ich finde sie sehr praktisch, wenn ich eine Zusammenfassung von data.frame (z describe(). B. mit ) erstelle .

Eine weitere nützliche Möglichkeit, ein solches zusätzliches Attribut zu verwenden, besteht darin, einen Zeitstempel auf einen Datensatz anzuwenden. Ich füge auch ein Attribut für Dinge wie Random Seed, Fold Number (wenn ich k-kold oder LOO Cross-Validation verwende) hinzu.

chl
quelle
14

-1-1

Ich würde es comment()als eine gute Möglichkeit sehen, diese Informationen als zukünftige Referenz an einen Datenrahmen anzuhängen.

Setzen Sie Monica - G. Simpson wieder ein
quelle
2
Die Standardlösung besteht darin, ein Feld für die Maßeinheiten einzuschließen, damit der Computer so programmiert werden kann, dass alle numerischen Ergebnisse in gemeinsame (parameterabhängige) Einheiten umgewandelt werden. Wenn Sie diese wichtigen Informationen in Kommentaren verbergen, wird die Implementierung dieser Funktion schwierig oder unmöglich.
whuber
2
@whuber, aber R hat kein solches Konstrukt in seinen Basisobjekten und ich möchte nicht einen ganzen Stapel von S4-Methoden schreiben, um Datenrahmen zu reproduzieren, die die Einheiteninformationen enthalten. Beachten Sie, dass dies comment()keine Kommentare im Code sind. Es fügt dem Objekt ein bestimmtes Attribut hinzu, das ein Vektor sein kann, wobei ein Element pro Spalte des Datenrahmens die Einheiteninformationen enthält. Es ist einfach, diese Informationen zu extrahieren, sodass ich nicht verstehe, warum die Implementierung von etwas schwierig oder unmöglich ist.
Setzen Sie Monica - G. Simpson
1
Gavin, ich schlage etwas viel Einfacheres vor. Wenn zum Beispiel manchmal Selenkonzentrationen in mg / L und zu anderen Zeiten in meq / L aufgezeichnet werden, können Sie leicht alle letzteren Fälle auswählen und die Konzentration mit dem entsprechenden Faktor multiplizieren, um sie in mg / L umzurechnen. Allerdings - dies kann die Quelle Ihrer objection-- sein Rist definitiv nicht der richtige Ort , um Datenbanken zu erhalten und Verfahren dieser Art durchgeführt wird , auch wenn es dazu in der Lage ist. Es wird am besten durch ein gutes Datenbankverwaltungssystem für solche Arbeiten ergänzt.
whuber
4
Und so ist es! comment()et al. sind praktisch für Ad-hoc-Notizen und -Infos, aber für die Datenverarbeitung in größerem Maßstab ist ein geeignetes System erforderlich. Interessanterweise müssen wir dies jetzt innerhalb der Forschungsgruppe und des Beratungsunternehmens, für das ich arbeite, in Bezug auf unsere Chemiedaten ansprechen und in eine geeignete Datenbank aufnehmen.
Setzen Sie Monica - G. Simpson
8

Ähnliche Funktionen gibt es in anderen Paketen, z. B. im Befehl -notes- in Stata . Wir verwenden dies, um vollständige Details einer Variablen zu dokumentieren , z. B. Details eines Assays für eine biochemische Messung oder den genauen Wortlaut der Frage, die für Fragebogendaten gestellt wurde. Dies sind oft zu viele Informationen für den Variablennamen oder die Bezeichnung, von denen eine oder beide in der Ausgabe jeder die Variable betreffenden Analyse angezeigt werden und daher angemessen kurz gehalten werden sollten.

ein Stop
quelle
4

Eines der Dinge, die ich häufig tue, ist das Verfolgen der Befehle, die zum Generieren von Daten und Objekten verwendet werden, und der Kommentar hat sich als nützliches Werkzeug dafür erwiesen.

Die 'matched.call.data' und 'generate.command.string' machen den Trick. Nicht perfekt, aber hilfreich und eine Verwendung für '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
quelle
2

Gestatten Sie mir, meine allgemeine Lösung für die Objektverwaltung in R: das repoPaket vorzuschlagen . Damit können Sie jeder Variablen einen langen Namen, eine Beschreibung, eine Reihe von Tags, eine Remote-URL und Abhängigkeitsrelationen zuweisen sowie Abbildungen oder generische externe Dateien anhängen. Beispielsweise kann Quellcode als Repository-Element gespeichert und an von ihm erstellte Ressourcen angehängt werden. Finden Sie die neueste stabile Version auf CRAN ( install.packages("repo")) oder die neueste Entwicklung auf Github . Ein kurzer Überblick hier . Ich hoffe es hilft.

Francesco Napolitano
quelle