Việc sử dụng tốt chức năng 'bình luận' trong R là gì?


35

Tôi mới phát hiện ra commenthàm trong R. Ví dụ:

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

Đây là lần đầu tiên tôi đến với chức năng này và đã tự hỏi những công dụng phổ biến / hữu ích của nó là gì. Vì khá khó khăn để tìm kiếm "R bình luận" trong google và tìm thấy kết quả có liên quan, tôi đã hy vọng ai đó ở đây có thể chia sẻ kinh nghiệm của mình.


3
Tôi không nghĩ rằng câu hỏi này thực sự cần phải là một CW. Đó là đường biên giới, nhưng nó không quá tệ.
csgillespie

thông tin tuyệt vời! (gói chuỗi thời gian 'xts' có chức năng siêu dữ liệu tương tự.)
doug

2
Câu hỏi này đã được đề xuất để đóng: nếu câu hỏi được hiểu rộng rãi (và lưu ý rằng hầu như không có câu trả lời nào là dành riêng cho R), đây thực sự là một câu hỏi về thời điểm và lý do tại sao người ta muốn gắn nhãn cột dữ liệu. Loại vấn đề quản lý dữ liệu này rõ ràng là một phần thường xuyên của thực tiễn thống kê, vì vậy có thể tranh luận về chủ đề ở đây.
Cá bạc

Câu trả lời:


15

Đến lần thứ hai @Gavin, Frank Harrell đã phát triển các cách hiệu quả để xử lý dữ liệu chú thích.frame trong R trong gói H'misc của mình . Ví dụ, các hàm label()units()cho phép thêm các thuộc tính chuyên dụng cho các đối tượng R. Tôi thấy chúng rất tiện dụng khi tạo bản tóm tắt data.frame (ví dụ: vớidescribe() ).

Một cách hữu ích khác để sử dụng một thuộc tính bổ sung như vậy là áp dụng dấu thời gian trên tập dữ liệu. Tôi cũng thêm một thuộc tính cho những thứ như hạt giống ngẫu nhiên, số lần gấp (khi tôi sử dụng xác thực chéo k-kold hoặc LOO).


14

-1-1

Tôi muốn xem comment()như một cách hay để đính kèm thông tin này vào khung dữ liệu để tham khảo trong tương lai.


2
Giải pháp tiêu chuẩn là bao gồm một trường cho các đơn vị đo lường, để máy tính có thể được lập trình để chuyển đổi tất cả các kết quả số sang các đơn vị chung (cụ thể theo tham số). Chôn thông tin quan trọng này trong các ý kiến ​​làm cho việc thực hiện khả năng này trở nên khó khăn hoặc không thể.
whuber

2
@whuber nhưng R không có cấu trúc như vậy trong các đối tượng cơ sở của nó và tôi không muốn viết toàn bộ chồng phương thức S4 để tạo lại các khung dữ liệu mang theo thông tin đơn vị. Lưu ý rằng đó comment()không phải là ý kiến ​​trong mã. Nó gắn một thuộc tính cụ thể vào đối tượng có thể là một vectơ, một phần tử trên mỗi cột của khung dữ liệu chứa thông tin đơn vị. Thật dễ dàng để trích xuất thông tin này vì vậy tôi không hiểu tại sao thực hiện bất cứ điều gì sẽ khó khăn hoặc không thể?
Phục hồi Monica - G. Simpson

1
Tôi đang đề xuất một cái gì đó đơn giản hơn nhiều . Chẳng hạn, nếu đôi khi nồng độ selen được ghi bằng mg / L và các lần khác là meq / L, bạn có thể dễ dàng chọn tất cả các trường hợp sau và nhân nồng độ với hệ số thích hợp để chuyển đổi thành mg / L. Tuy nhiên - đây có thể là nguồn gốc của sự phản đối của bạn-- Rchắc chắn không phải là nơi thích hợp để duy trì cơ sở dữ liệu và thực hiện các quy trình thuộc loại này, mặc dù nó có khả năng làm như vậy. Nó được bổ sung tốt nhất bởi một hệ thống quản lý cơ sở dữ liệu tốt cho công việc như vậy.
whuber

4
Amen đến đó! comment()et al có ích cho ghi chú và thông tin đặc biệt, nhưng cần có một hệ thống phù hợp để xử lý dữ liệu quy mô lớn hơn. Điều thú vị là chúng ta phải giải quyết vấn đề này ngay bây giờ trong nhóm nghiên cứu và tư vấn mà tôi làm việc liên quan đến dữ liệu hóa học của chúng tôi và cần đưa nó vào một cơ sở dữ liệu thích hợp.
Phục hồi Monica - G. Simpson

8

Các phương tiện tương tự tồn tại trong các gói khác, chẳng hạn như lệnh -notes- trong Stata . Chúng tôi sử dụng điều này để ghi lại chi tiết đầy đủ của một biến, ví dụ chi tiết về xét nghiệm cho phép đo sinh hóa, hoặc từ ngữ chính xác của câu hỏi được yêu cầu cho dữ liệu câu hỏi. Đây thường là quá nhiều thông tin cho tên biến hoặc nhãn, một hoặc cả hai được hiển thị trong đầu ra của mọi phân tích liên quan đến biến và do đó tốt nhất là giữ ngắn một cách hợp lý.


4

Một trong những điều tôi thấy mình làm rất nhiều là theo dõi các lệnh được sử dụng để tạo dữ liệu và đối tượng và đã tìm thấy nhận xét là một công cụ hữu ích cho việc này.

'Match.call.data' và 'created.command.opes' thực hiện thủ thuật. Không hoàn hảo, nhưng hữu ích và sử dụng cho 'bình luận ()'. :)

# 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

Cho phép tôi đề xuất giải pháp chung của mình để quản lý đối tượng trong R: repogói. Sử dụng nó, bạn có thể gán cho mỗi biến một tên dài, mô tả, một bộ thẻ, url từ xa, quan hệ phụ thuộc và cũng có thể đính kèm các số liệu hoặc các tệp bên ngoài chung chung. Ví dụ, mã nguồn có thể được lưu trữ dưới dạng một mục lưu trữ và được đính kèm với các tài nguyên do nó tạo ra. Tìm bản phát hành ổn định mới nhất trên CRAN ( install.packages("repo")) hoặc bản phát triển mới nhất trên github . Tổng quan nhanh ở đây . Hy vọng nó giúp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.