Qual é o bom uso da função 'comment' no R?


35

Acabei de descobrir a commentfunção em R. Exemplo:

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

Esta é a primeira vez que deparei com essa função e fiquei imaginando quais são os usos comuns / úteis dela. Como é bastante difícil pesquisar "R comment" no google e encontrar resultados relevantes, eu esperava que alguém aqui pudesse compartilhar sua experiência.


3
Eu não acho que essa pergunta realmente precise ser uma CW. É limítrofe, mas não é tão ruim.
csgillespie

ótima informação! (o pacote de séries de tempo 'xts' tem esta funcionalidade semelhante metadados.)
Doug

2
Esta pergunta foi sugerida para o fechamento: se a pergunta for amplamente interpretada (e observe que praticamente nenhuma das respostas é específica de R), essa é realmente uma pergunta sobre quando e por que alguém deseja rotular colunas de dados. Esse tipo de problema de gerenciamento de dados é claramente uma parte regular da prática estatística, por isso é discutível aqui.
Silverfish

Respostas:


15

Para secundar @Gavin, Frank Harrell desenvolveu maneiras eficientes de manipular data.frame anotado em R em seu pacote Hmisc . Por exemplo, as funções label()e units()permitem adicionar atributos dedicados aos objetos R. Eu os acho muito úteis ao produzir um resumo do data.frame (por exemplo, com describe()).

Outra maneira útil de usar esse atributo extra é aplicar um registro de data e hora em um conjunto de dados. Também adiciono um atributo para coisas como semente aleatória, número da dobra (quando eu uso a validação cruzada k-kold ou LOO).


14

Uma coisa que costumo fazer nos meus scripts R para uma tarefa de análise de dados específica é incluir comentários no script sobre as unidades de variáveis ​​nos meus quadros de dados. Trabalho com dados ambientais e químicos e ecologistas parecem gostar de usar uma ampla gama de unidades diferentes para as mesmas coisas (mg L vs mu eq L , etc.). Meus colegas geralmente armazenam essas informações na linha imediatamente abaixo dos nomes das colunas nas planilhas do Excel.-1 1-1 1

Eu consideraria comment()uma boa maneira de anexar essas informações a um quadro de dados para referência futura.


2
A solução padrão é incluir um campo para as unidades de medida, para que o computador possa ser programado para converter todos os resultados numéricos em unidades comuns (específicas de parâmetros). Enterrar essas informações cruciais nos comentários torna a implementação desse recurso difícil ou impossível.
whuber

2
@whuber, mas R não tem essa construção em seus objetos base e eu não quero escrever uma pilha inteira de métodos S4 para reproduzir quadros de dados que carregam as informações da unidade. Observe que comment()não há comentários no código. Ele anexa um atributo específico ao objeto que pode ser um vetor, um elemento por coluna do quadro de dados que contém as informações das unidades. É fácil extrair essas informações, então não vejo por que implementar algo seria difícil ou impossível?
Reinstate Monica - G. Simpson

11
Gavin, estou sugerindo algo muito mais simples. Por exemplo, se algumas vezes as concentrações de selênio forem registradas em mg / L e outras vezes como meq / L, você poderá selecionar facilmente todas as instâncias desta última e multiplicar a concentração pelo fator apropriado para convertê-la em mg / L. No entanto - essa pode ser a fonte de sua objeção - Rdefinitivamente não é o lugar certo para manter bancos de dados e executar processos desse tipo, mesmo que seja capaz de fazê-lo. É melhor complementado por um bom sistema de gerenciamento de banco de dados para esse trabalho.
whuber

4
Amém! comment()et al são úteis para notas e informações ad hoc, mas é necessário um sistema adequado para o tratamento de dados em maior escala. Curiosamente, estamos tendo que resolver isso agora dentro do grupo de pesquisa e consultoria em que trabalho em relação aos nossos dados químicos e precisando colocá-los em um banco de dados adequado.
Reinstate Monica - G. Simpson

8

Instalações semelhantes existem em outros pacotes, como o comando -notes- no Stata . Usamos isso para documentar detalhes completos de uma variável, por exemplo, detalhes do ensaio para uma medida bioquímica ou a formulação exata da pergunta solicitada para dados do questionário. Geralmente, são muitas informações para o nome ou rótulo da variável, um ou ambos exibidos na saída de todas as análises que envolvem a variável e, portanto, devem ser mantidos razoavelmente curtos.


4

Uma das coisas que me vejo fazendo muito é rastrear os comandos usados ​​para gerar dados e objetos, e achei o comentário uma ferramenta útil para isso.

O 'matched.call.data' e 'generate.command.string' fazem o truque. Não é perfeito, mas útil e um uso para '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] )

2

Permita-me sugerir minha solução geral para gerenciamento de objetos em R: o repopacote. Com ele, você pode atribuir a cada variável um nome longo, uma descrição, um conjunto de tags, um URL remoto, relações de dependência e também anexar figuras ou arquivos externos genéricos. Por exemplo, o código-fonte pode ser armazenado como um item de repositório e anexado aos recursos produzidos por ele. Encontre a versão estável mais recente no CRAN ( install.packages("repo")) ou o desenvolvimento mais recente no github . Uma rápida visão geral aqui . Espero que ajude.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.