Câu hỏi Làm thế nào để tạo ra một ví dụ tái tạo R tuyệt vời?


Khi thảo luận về hiệu suất với đồng nghiệp, giảng dạy, gửi báo cáo lỗi hoặc tìm kiếm hướng dẫn về danh sách gửi thư và tại đây trên SO, một ví dụ tái sản xuất thường được hỏi và luôn hữu ích.

Mẹo của bạn để tạo một ví dụ tuyệt vời là gì? Làm thế nào để bạn dán cấu trúc dữ liệu từ  ở định dạng văn bản? Bạn nên đưa thông tin nào khác?

Có những thủ thuật khác ngoài việc sử dụng dput(), dump() hoặc là structure()? Khi nào bạn nên bao gồm library() hoặc là require() các câu lệnh? Những từ dành riêng nào nên tránh, ngoài c, df, data, v.v.

Làm thế nào để làm cho một tuyệt vời  ví dụ tái sản xuất?


2381


gốc


Tôi đang bối rối về phạm vi của câu hỏi. Mọi người dường như đã nhảy vào việc giải thích các ví dụ tái sản xuất trong việc đặt câu hỏi về SO hoặc R-trợ giúp (làm thế nào để "tái tạo lỗi"). Điều gì về các ví dụ R có thể tái sản xuất trong các trang trợ giúp? Trong bản trình diễn gói? Trong hướng dẫn / thuyết trình? - baptiste
@ baptiste: Cùng trừ đi lỗi. Tất cả các kỹ thuật tôi đã giải thích được sử dụng trong các trang trợ giúp về gói và trong các hướng dẫn và bản trình bày tôi cung cấp cho R - Joris Meys
Dữ liệu đôi khi là yếu tố hạn chế, vì cấu trúc có thể quá phức tạp để mô phỏng. Để tạo dữ liệu công khai từ dữ liệu cá nhân: stackoverflow.com/a/10458688/742447 trong stackoverflow.com/questions/10454973/… - Etienne Low-Décarie


Các câu trả lời:


Một ví dụ tái sản xuất tối thiểu bao gồm các mục sau:

  • một tập dữ liệu tối thiểu, cần thiết để tạo lại lỗi
  • tối thiểu runnable mã cần thiết để tạo lại lỗi, có thể chạy trên tập dữ liệu đã cho.
  • các thông tin cần thiết về các gói đã sử dụng, phiên bản R và hệ thống được chạy trên đó.
  • trong trường hợp của các quá trình ngẫu nhiên, một hạt giống (được thiết lập bởi set.seed()) để tái lập

Nhìn vào các ví dụ trong các tệp trợ giúp của các hàm được sử dụng thường hữu ích. Nói chung, tất cả các mã được đưa ra ở đó đáp ứng các yêu cầu của một ví dụ tái sản xuất tối thiểu: dữ liệu được cung cấp, mã tối thiểu được cung cấp, và mọi thứ đều có thể chạy được.

Sản xuất tập dữ liệu tối thiểu

Đối với hầu hết các trường hợp, điều này có thể dễ dàng thực hiện bằng cách chỉ cung cấp khung vector / dữ liệu với một số giá trị. Hoặc bạn có thể sử dụng một trong các bộ dữ liệu tích hợp, được cung cấp với hầu hết các gói.
Có thể xem danh sách đầy đủ các bộ dữ liệu tích hợp library(help = "datasets"). Có một mô tả ngắn cho mọi tập dữ liệu và có thể lấy thêm thông tin ví dụ với ?mtcars nơi 'mtcars' là một trong những bộ dữ liệu trong danh sách. Các gói khác có thể chứa các tập dữ liệu bổ sung.

Làm cho một vector dễ dàng. Đôi khi nó là cần thiết để thêm một số ngẫu nhiên vào nó, và có một số lượng toàn bộ các chức năng để làm điều đó. sample() có thể ngẫu nhiên một vectơ, hoặc cho một vectơ ngẫu nhiên chỉ với một vài giá trị. letters là một vectơ hữu ích chứa bảng chữ cái. Điều này có thể được sử dụng để tạo ra các yếu tố.

Một vài ví dụ :

  • giá trị ngẫu nhiên: x <- rnorm(10) để phân phối bình thường, x <- runif(10) để phân phối thống nhất, ...
  • một hoán vị của một số giá trị: x <- sample(1:10) cho vector 1:10 theo thứ tự ngẫu nhiên.
  • một yếu tố ngẫu nhiên: x <- sample(letters[1:4], 20, replace = TRUE)

Đối với ma trận, người ta có thể sử dụng matrix(), ví dụ :

matrix(1:10, ncol = 2)

Tạo khung dữ liệu có thể được thực hiện bằng cách sử dụng data.frame(). Người ta phải chú ý đến tên các mục trong khung dữ liệu, và không làm cho nó quá phức tạp.

Một ví dụ :

set.seed(1)
Data <- data.frame(
    X = sample(1:10),
    Y = sample(c("yes", "no"), 10, replace = TRUE)
)

Đối với một số câu hỏi, có thể cần các định dạng cụ thể. Đối với những người này, người ta có thể sử dụng bất kỳ as.someType chức năng : as.factor, as.Date, as.xts, ... Chúng kết hợp với các thủ thuật vectơ và / hoặc khung dữ liệu.

Sao chép dữ liệu của bạn

Nếu bạn có một số dữ liệu quá khó để xây dựng bằng cách sử dụng các mẹo này, thì bạn luôn có thể tạo một tập hợp con dữ liệu gốc của mình, ví dụ: head(), subset()hoặc các chỉ số. Sau đó sử dụng ví dụ. dput() để cung cấp cho chúng tôi thứ gì đó có thể được đưa vào R ngay lập tức:

> dput(head(iris,4))
structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6), Sepal.Width = c(3.5, 
3, 3.2, 3.1), Petal.Length = c(1.4, 1.4, 1.3, 1.5), Petal.Width = c(0.2, 
0.2, 0.2, 0.2), Species = structure(c(1L, 1L, 1L, 1L), .Label = c("setosa", 
"versicolor", "virginica"), class = "factor")), .Names = c("Sepal.Length", 
"Sepal.Width", "Petal.Length", "Petal.Width", "Species"), row.names = c(NA, 
4L), class = "data.frame")

Nếu khung dữ liệu của bạn có một yếu tố với nhiều cấp độ, dput đầu ra có thể khó sử dụng bởi vì nó vẫn sẽ liệt kê tất cả các mức yếu tố có thể ngay cả khi chúng không có trong tập con của dữ liệu của bạn. Để giải quyết vấn đề này, bạn có thể sử dụng droplevels() chức năng. Lưu ý bên dưới cách loài là một yếu tố chỉ có một cấp:

> dput(droplevels(head(iris, 4)))
structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6), Sepal.Width = c(3.5, 
3, 3.2, 3.1), Petal.Length = c(1.4, 1.4, 1.3, 1.5), Petal.Width = c(0.2, 
0.2, 0.2, 0.2), Species = structure(c(1L, 1L, 1L, 1L), .Label = "setosa",
class = "factor")), .Names = c("Sepal.Length", "Sepal.Width", 
"Petal.Length", "Petal.Width", "Species"), row.names = c(NA, 
4L), class = "data.frame")

Một báo trước khác cho dput là nó sẽ không hoạt động cho keyed data.table đối tượng hoặc cho nhóm tbl_df (lớp học grouped_df) từ dplyr. Trong những trường hợp này, bạn có thể chuyển đổi trở lại khung dữ liệu thông thường trước khi chia sẻ, dput(as.data.frame(my_data)).

Kịch bản trường hợp xấu nhất, bạn có thể đưa ra một biểu diễn văn bản có thể đọc bằng cách sử dụng text thông số của read.table :

zz <- "Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa"

Data <- read.table(text=zz, header = TRUE)

Sản xuất mã tối thiểu

Đây phải là phần dễ dàng nhưng thường thì không. Những gì bạn không nên làm, là:

  • thêm tất cả các loại chuyển đổi dữ liệu. Đảm bảo dữ liệu được cung cấp đã ở định dạng đúng (trừ khi đó là vấn đề của khóa học)
  • sao chép-dán toàn bộ chức năng / đoạn mã cung cấp cho một lỗi. Trước tiên, hãy thử xác định đường nào sẽ dẫn đến lỗi chính xác. Thường xuyên hơn không bạn sẽ tìm ra những gì vấn đề là chính mình.

Những gì bạn nên làm, là:

  • thêm gói nào sẽ được sử dụng nếu bạn sử dụng bất kỳ gói nào (sử dụng library())
  • nếu bạn mở kết nối hoặc tạo tệp, hãy thêm một số mã để đóng hoặc xóa tệp (sử dụng unlink())
  • nếu bạn thay đổi các tùy chọn, hãy đảm bảo mã chứa một câu lệnh để hoàn nguyên chúng trở lại các tùy chọn ban đầu. (ví dụ op <- par(mfrow=c(1,2)) ...some code... par(op) )
  • kiểm tra chạy mã của bạn trong một phiên R trống mới để đảm bảo mã được chạy. Mọi người sẽ có thể chỉ sao chép và dán dữ liệu của bạn và mã của bạn trong bảng điều khiển và nhận được chính xác giống như bạn có.

Cung cấp thêm thông tin

Trong hầu hết các trường hợp, chỉ phiên bản R và hệ điều hành sẽ đủ. Khi xung đột nảy sinh với các gói, cho đầu ra của sessionInfo() thực sự có thể giúp đỡ. Khi nói về các kết nối đến các ứng dụng khác (có thể thông qua ODBC hoặc bất kỳ ứng dụng nào khác), bạn cũng nên cung cấp số phiên bản cho các ứng dụng đó và nếu có thể cũng có các thông tin cần thiết về thiết lập.

Nếu bạn đang chạy R trong Studio R sử dụng rstudioapi::versionInfo() có thể hữu ích khi báo cáo phiên bản RStudio của bạn.

Nếu bạn gặp sự cố với gói cụ thể, bạn có thể muốn cung cấp phiên bản của gói bằng cách cung cấp kết quả của packageVersion("name of the package").


1454



Bạn dùng như thế nào dput nếu dataframe là rất lớn và vấn đề được tạo ra bởi giữa các dataframe? Có cách nào để sử dụng không dput sao chép phần giữa của dữ liệu, nói các hàng từ 60 đến 70? - BgnR
@BgnR Bạn có thể trích xuất một phần của khung dữ liệu bằng cách sử dụng các chỉ mục, ví dụ: tmp <- mydf[50:70,] theo dõi bởi dput(mydf). Nếu khung dữ liệu thực sự lớn, hãy thử cách ly sự cố và chỉ gửi vài dòng gây ra sự cố. - Joris Meys
@ JorisMeys: Có cách nào để nói head hoặc là dput thế nào để hạn chế dữ liệu ở mức N đệ quy? Tôi đang cố gắng đưa ra ví dụ tái sản xuất và dữ liệu của tôi là danh sách các khung dữ liệu. Vì thế, dput(head(myDataObj)) có vẻ như không đủ, vì nó tạo ra một tập tin đầu ra có kích thước 14MB. - Aleksandr Blekh
@JorisMeys: Chỉ cần FYI - đăng câu hỏi trong phần bình luận ở trên như một câu hỏi riêng biệt: stackoverflow.com/questions/25127026/…. - Aleksandr Blekh
@Konrad Điều tốt nhất bạn có thể làm, là liên kết đến tệp và cung cấp lệnh tối thiểu để đọc trong tệp đó. Điều đó sẽ ít rắc rối hơn việc sao chép-dán đầu ra của dput () :) - Joris Meys


(Đây là lời khuyên của tôi từ Cách viết một ví dụ tái sản xuất . Tôi đã cố gắng để làm cho nó ngắn nhưng ngọt ngào)

Làm thế nào để viết một ví dụ tái sản xuất.

Bạn có nhiều khả năng nhận được sự trợ giúp tốt nhất với vấn đề R của mình nếu bạn cung cấp một ví dụ tái sản xuất. Ví dụ tái sản xuất cho phép người khác tạo lại vấn đề của bạn bằng cách chỉ sao chép và dán mã R.

Có bốn điều bạn cần đưa vào để làm cho ví dụ của bạn có thể tái sản xuất: các gói, dữ liệu, mã và mô tả về môi trường R của bạn.

  • Góinên được tải ở đầu tập lệnh, vì vậy thật dễ dàng xem ví dụ nào cần.

  • Cách dễ nhất để bao gồm dữ liệu trong email hoặc câu hỏi tràn ngăn xếp là sử dụng dput() để tạo ra mã R để tạo lại nó. Ví dụ: để tạo lại mtcars bộ dữ liệu trong R, Tôi sẽ thực hiện các bước sau:

    1. Chạy dput(mtcars) trong R
    2. Sao chép đầu ra
    3. Trong kịch bản có thể tái sản xuất của tôi, hãy nhập mtcars <- sau đó dán.
  • Hãy dành một chút thời gian để đảm bảo rằng  dễ dàng cho người khác đọc:

    • đảm bảo bạn đã sử dụng dấu cách và tên biến của bạn ngắn gọn, nhưng nhiều thông tin

    • sử dụng các bình luận để chỉ ra nơi mà vấn đề của bạn nằm

    • cố hết sức để loại bỏ mọi thứ không liên quan đến vấn đề.
      Mã của bạn càng ngắn thì càng dễ hiểu.

  • Bao gồm đầu ra của sessionInfo() trong một bình luận trong mã của bạn. Điều này tóm tắt R môi trường và giúp bạn dễ dàng kiểm tra xem bạn có đang sử dụng lỗi thời hay không gói.

Bạn có thể kiểm tra xem bạn đã thực sự tạo một ví dụ có thể sao chép bằng cách bắt đầu một phiên R mới và dán tập lệnh của bạn vào.

Trước khi đặt tất cả mã của bạn vào một email, hãy cân nhắc đưa mã vào Gist github . Nó sẽ cung cấp cho mã của bạn cú pháp tô sáng đẹp, và bạn không phải lo lắng về bất cứ điều gì bị xáo trộn bởi hệ thống email.


514



reprex trong tidyverselà một gói tốt để tạo ra ví dụ tối thiểu, có thể tái sản xuất: github.com/tidyverse/reprex - mt1022
Tại sao mọi người lại đặt mã trong email? - Gilgamesh
Tôi thường xuyên nhận được email có mã trong đó. Tôi thậm chí còn nhận được email với các tài liệu từ đính kèm có chứa mã. Đôi khi tôi thậm chí nhận được email với các tài liệu từ đính kèm có chứa SCREENSHOTS mã. - hadley


Cá nhân, tôi thích "một" lót. Một cái gì đó dọc theo dòng:

my.df <- data.frame(col1 = sample(c(1,2), 10, replace = TRUE),
        col2 = as.factor(sample(10)), col3 = letters[1:10],
        col4 = sample(c(TRUE, FALSE), 10, replace = TRUE))
my.list <- list(list1 = my.df, list2 = my.df[3], list3 = letters)

Cấu trúc dữ liệu nên bắt chước ý tưởng của vấn đề của nhà văn chứ không phải cấu trúc đúng nguyên văn. Tôi thực sự đánh giá cao khi các biến không ghi đè các biến của riêng tôi hoặc các lệnh cấm, các hàm (như df).

Ngoài ra, người ta có thể cắt một vài góc và trỏ đến một tập dữ liệu đã có từ trước, giống như:

library(vegan)
data(varespec)
ord <- metaMDS(varespec)

Đừng quên đề cập đến bất kỳ gói đặc biệt nào mà bạn có thể đang sử dụng.

Nếu bạn đang cố gắng chứng minh điều gì đó trên các vật thể lớn hơn, bạn có thể thử

my.df2 <- data.frame(a = sample(10e6), b = sample(letters, 10e6, replace = TRUE))

Nếu bạn đang làm việc với dữ liệu không gian qua raster gói, bạn có thể tạo một số dữ liệu ngẫu nhiên. Có thể tìm thấy rất nhiều ví dụ trong họa tiết gói, nhưng đây là một mẩu nhỏ.

library(raster)
r1 <- r2 <- r3 <- raster(nrow=10, ncol=10)
values(r1) <- runif(ncell(r1))
values(r2) <- runif(ncell(r2))
values(r3) <- runif(ncell(r3))
s <- stack(r1, r2, r3)

Nếu bạn đang cần một số đối tượng không gian như được triển khai trong sp, bạn có thể nhận được một số tập dữ liệu qua các tệp bên ngoài (như shapefile ESRI) trong các gói "không gian" (xem chế độ xem Không gian trong Chế độ xem Tác vụ).

library(rgdal)
ogrDrivers()
dsn <- system.file("vectors", package = "rgdal")[1]
ogrListLayers(dsn)
ogrInfo(dsn=dsn, layer="cities")
cities <- readOGR(dsn=dsn, layer="cities")

258



IMHO, khi sử dụng sample hoặc là runif nó thận trọng để set.seed. Ít nhất, đây là gợi ý tôi đã nhận được khi tạo ra các ví dụ về việc lấy mẫu hoặc tạo số ngẫu nhiên. - Konrad
@Konrad Tôi đồng ý, nhưng điều này có thể phụ thuộc. Nếu bạn chỉ cố gắng để tạo ra một số con số một hạt giống có thể không cần thiết nhưng nếu bạn đang cố gắng để hiểu một cái gì đó cụ thể, nơi số cố định là cần thiết, một hạt giống sẽ là bắt buộc. - Roman Luštrik


Lấy cảm hứng từ bài viết này, bây giờ tôi sử dụng một chức năng tiện dụng
reproduce(<mydata>) khi tôi cần đăng lên StackOverflow.


NHỮNG HƯỚNG DẪN NHANH

Nếu myData là tên đối tượng của bạn để tái tạo, hãy chạy như sau trong R:

install.packages("devtools")
library(devtools)
source_url("https://raw.github.com/rsaporta/pubR/gitbranch/reproduce.R")

reproduce(myData)

Chi tiết:

Hàm này là một trình bao bọc thông minh dput và thực hiện như sau:

  • tự động lấy mẫu một tập dữ liệu lớn (dựa trên kích thước và lớp. Cỡ mẫu có thể được điều chỉnh)
  • tạo ra một dput đầu ra
  • cho phép bạn chỉ định cái nào cột để xuất
  • gắn vào mặt trước của nó objName <- ... để có thể dễ dàng sao chép + dán, nhưng ...
  • Nếu làm việc trên một mac, đầu ra được sao chép tự động vào clipboard, để bạn có thể chỉ cần chạy nó và sau đó dán vào câu hỏi của bạn.

Nguồn có sẵn ở đây:


Thí dụ:

# sample data
DF <- data.frame(id=rep(LETTERS, each=4)[1:100], replicate(100, sample(1001, 100)), Class=sample(c("Yes", "No"), 100, TRUE))

DF là khoảng 100 x 102. Tôi muốn lấy mẫu 10 hàng và một vài cột cụ thể

reproduce(DF, cols=c("id", "X1", "X73", "Class"))  # I could also specify the column number. 

Cung cấp đầu ra sau:

This is what the sample looks like: 

    id  X1 X73 Class
1    A 266 960   Yes
2    A 373 315    No            Notice the selection split 
3    A 573 208    No           (which can be turned off)
4    A 907 850   Yes
5    B 202  46   Yes         
6    B 895 969   Yes   <~~~ 70 % of selection is from the top rows
7    B 940 928    No
98   Y 371 171   Yes          
99   Y 733 364   Yes   <~~~ 30 % of selection is from the bottom rows.  
100  Y 546 641    No        


    ==X==============================================================X==
         Copy+Paste this part. (If on a Mac, it is already copied!)
    ==X==============================================================X==

 DF <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 25L, 25L, 25L), .Label = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y"), class = "factor"), X1 = c(266L, 373L, 573L, 907L, 202L, 895L, 940L, 371L, 733L, 546L), X73 = c(960L, 315L, 208L, 850L, 46L, 969L, 928L, 171L, 364L, 641L), Class = structure(c(2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L), .Label = c("No", "Yes"), class = "factor")), .Names = c("id", "X1", "X73", "Class"), class = "data.frame", row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 98L, 99L, 100L)) 

    ==X==============================================================X==

Cũng lưu ý rằng toàn bộ đầu ra nằm trong một dòng đơn dài, đẹp, không phải là một đoạn cao của các đường cắt nhỏ. Điều này làm cho nó dễ dàng hơn để đọc trên các bài viết SO câu hỏi và cũng dễ dàng hơn để sao chép + dán.


Cập nhật tháng 10 năm 2013:

Bây giờ bạn có thể xác định có bao nhiêu dòng văn bản đầu ra sẽ mất (tức là, những gì bạn sẽ dán vào StackOverflow). Sử dụng lines.out=n lập luận cho điều này. Thí dụ:

reproduce(DF, cols=c(1:3, 17, 23), lines.out=7) sản lượng:

    ==X==============================================================X==
         Copy+Paste this part. (If on a Mac, it is already copied!)
    ==X==============================================================X==

 DF <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 25L,25L, 25L), .Label
      = c("A", "B", "C", "D", "E", "F", "G", "H","I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U","V", "W", "X", "Y"), class = "factor"),
      X1 = c(809L, 81L, 862L,747L, 224L, 721L, 310L, 53L, 853L, 642L),
      X2 = c(926L, 409L,825L, 702L, 803L, 63L, 319L, 941L, 598L, 830L),
      X16 = c(447L,164L, 8L, 775L, 471L, 196L, 30L, 420L, 47L, 327L),
      X22 = c(335L,164L, 503L, 407L, 662L, 139L, 111L, 721L, 340L, 178L)), .Names = c("id","X1",
      "X2", "X16", "X22"), class = "data.frame", row.names = c(1L,2L, 3L, 4L, 5L, 6L, 7L, 98L, 99L, 100L))

    ==X==============================================================X==

241





Đây là hướng dẫn tốt:

http://www.r-bloggers.com/three-tips-for-posting-good-questions-to-r-help-and-stack-overflow/

Nhưng điều quan trọng nhất là: Chỉ cần đảm bảo rằng bạn tạo một đoạn mã nhỏ mà chúng tôi có thể chạy để xem vấn đề là gì. Một chức năng hữu ích cho việc này là dput(), nhưng nếu bạn có dữ liệu rất lớn, bạn có thể muốn tạo một tập dữ liệu mẫu nhỏ hoặc chỉ sử dụng 10 dòng đầu tiên.

CHỈNH SỬA:

Ngoài ra, hãy đảm bảo rằng bạn đã xác định được vấn đề ở đâu. Ví dụ không được là toàn bộ tập lệnh R với "Trên dòng 200 có lỗi". Nếu bạn sử dụng công cụ gỡ lỗi trong R (tôi yêu browser()) và google, bạn sẽ có thể thực sự xác định nơi mà vấn đề là và tái tạo một ví dụ tầm thường, trong đó cùng một điều đi sai.


168





Danh sách gửi thư R-help có hướng dẫn đăng bài bao gồm cả câu hỏi hỏi và trả lời, bao gồm ví dụ về tạo dữ liệu:

Ví dụ: Đôi khi nó giúp   cung cấp một ví dụ nhỏ cho ai đó   thực sự có thể chạy. Ví dụ:

Nếu tôi có ma trận x như sau:

  > x <- matrix(1:8, nrow=4, ncol=2,
                dimnames=list(c("A","B","C","D"), c("x","y"))
  > x
    x y
  A 1 5
  B 2 6
  C 3 7
  D 4 8
  >

làm thế nào tôi có thể biến nó thành một khung dữ liệu   với 8 hàng và ba cột có tên   'hàng', 'col' và 'giá trị', trong đó có   tên thứ nguyên là các giá trị của 'hàng' và 'col', như sau:

  > x.df
     row col value
  1    A   x      1

...
  (Câu trả lời có thể là:

  > x.df <- reshape(data.frame(row=rownames(x), x), direction="long",
                    varying=list(colnames(x)), times=colnames(x),
                    v.names="value", timevar="col", idvar="row")

)

Từ nhỏ bé đặc biệt quan trọng. Bạn nên nhắm đến tối thiểu ví dụ tái sản xuất, có nghĩa là dữ liệu và mã nên đơn giản nhất có thể để giải thích vấn đề.

EDIT: Mã đẹp dễ đọc hơn mã xấu xí. Sử dụng một hướng dẫn mẫu.


142





Kể từ R.2.14 (tôi đoán) bạn có thể nạp trực tiếp văn bản dữ liệu của bạn vào read.table:

df <- read.table(header=T, text="Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
") 

136



Bạn cũng có thể dùng read.table("clipboard", header=TRUE). - sebastian-c
@ sebastian-c làm thế nào là tốt để làm ví dụ tái sản xuất ?? :) - TMS
@TMS Đưa ra suy nghĩ nghiêm túc, nếu người hỏi đã cung cấp dữ liệu và vấn đề nhỏ (nhưng có thể có một vài giải pháp), thì nó có thể nhanh hơn và bạn vẫn có thể làm theo tất cả các bước. - sebastian-c


Đôi khi vấn đề thực sự không thể tái sản xuất với một đoạn dữ liệu nhỏ hơn, bất kể bạn cố gắng thế nào và không xảy ra với dữ liệu tổng hợp (mặc dù việc hiển thị cách bạn tạo ra các tập dữ liệu tổng hợp đã thực sự hữu ích như thế nào không phải tái tạo vấn đề, bởi vì nó đưa ra một số giả thuyết).

  • Đăng dữ liệu lên web ở đâu đó và cung cấp URL có thể cần thiết.
  • Nếu dữ liệu không thể được công bố rộng rãi nhưng có thể được chia sẻ, thì bạn có thể cung cấp e-mail cho các bên quan tâm (mặc dù điều này sẽ giảm số lượng người sẽ làm việc trên đó).
  • Tôi chưa thực sự thấy điều này được thực hiện, bởi vì những người không thể phát hành dữ liệu của họ nhạy cảm về việc phát hành bất kỳ biểu mẫu nào, nhưng có vẻ hợp lý rằng trong một số trường hợp, người dùng vẫn có thể đăng dữ liệu nếu nó đủ ẩn danh / tranh giành / hỏng một chút một cách nào đó.

Nếu bạn không thể thực hiện một trong hai cách này thì có thể bạn cần thuê một nhà tư vấn để giải quyết vấn đề của mình ...

chỉnh sửa: Hai câu hỏi SO hữu ích cho ẩn danh / xáo trộn:


126



Để sản xuất bộ dữ liệu tổng hợp, câu trả lời cho câu hỏi này đưa ra các ví dụ hữu ích, bao gồm các ứng dụng của fitdistr và fitdistrplus. - Iterator


Các câu trả lời cho đến nay rõ ràng là tuyệt vời cho phần tái sản xuất. Đây chỉ là để làm rõ rằng một ví dụ tái sản xuất không thể và không nên là thành phần duy nhất của một câu hỏi. Đừng quên giải thích những gì bạn muốn nó trông giống như và các đường nét của vấn đề của bạn, không chỉ là cách bạn đã cố gắng để đạt được điều đó cho đến nay. Mã không đủ; bạn cũng cần lời.

Dưới đây là một ví dụ tái sản xuất về những gì cần tránh làm (được rút ra từ một ví dụ thực tế, tên được thay đổi để bảo vệ người vô tội):


Sau đây là dữ liệu mẫu và một phần của hàm tôi gặp sự cố.

code
code
code
code
code (40 or so lines of it)

Làm thế nào tôi có thể đạt được điều này ?



115