在与同事讨论绩效、教学、发送错误报告或搜索邮件列表和Stack Overflow上的指导时,经常会询问一个可重复的示例,并且总是很有用。

你有什么建议来创建一个优秀的例子?如何以文本格式粘贴r中的数据结构?您还应包括哪些其他信息?

除了使用dput()、dump()或structure()之外,还有其他技巧吗?什么时候应该包含library()或require()语句?除了c、df、data等之外,应该避免哪些保留字。?

如何做出一个伟大的、可重复的例子?


当前回答

我正在开发wakefield包,以解决快速共享可复制数据的需求,有时dput对较小的数据集很好,但我们处理的许多问题要大得多,通过dput共享如此大的数据集是不切实际的。

关于:

wakefield允许用户共享最少的代码来再现数据。用户设置n(行数)并指定任意数量的预设变量函数(目前有70个),这些函数模拟真实的if数据(如性别、年龄、收入等)

安装:

目前(2015年6月11日),wakefield是一个GitHub包,但在编写单元测试后,最终将转到CRAN。要快速安装,请使用:

if (!require("pacman")) install.packages("pacman")
pacman::p_load_gh("trinker/wakefield")

例子:

下面是一个示例:

r_data_frame(
    n = 500,
    id,
    race,
    age,
    sex,
    hour,
    iq,
    height,
    died
)

这将产生:

    ID  Race Age    Sex     Hour  IQ Height  Died
1  001 White  33   Male 00:00:00 104     74  TRUE
2  002 White  24   Male 00:00:00  78     69 FALSE
3  003 Asian  34 Female 00:00:00 113     66  TRUE
4  004 White  22   Male 00:00:00 124     73  TRUE
5  005 White  25 Female 00:00:00  95     72  TRUE
6  006 White  26 Female 00:00:00 104     69  TRUE
7  007 Black  30 Female 00:00:00 111     71 FALSE
8  008 Black  29 Female 00:00:00 100     64  TRUE
9  009 Asian  25   Male 00:30:00 106     70 FALSE
10 010 White  27   Male 00:30:00 121     68 FALSE
.. ...   ... ...    ...      ... ...    ...   ...

其他回答

有时,无论你如何努力,问题真的无法用较小的数据块再现,而且合成数据也不会发生(尽管展示你是如何生成没有再现问题的合成数据集是有用的,因为它排除了一些假设)。

可能需要将数据发布到web某处并提供URL。如果数据不能向公众公开,但可以共享,那么您可以通过电子邮件将其发送给感兴趣的各方(尽管这将减少需要处理的人数)。我实际上还没有看到这样做,因为无法发布数据的人对以任何形式发布数据都很敏感,但在某些情况下,如果数据在某种程度上被充分匿名/加扰/轻微损坏,人们仍然可以发布数据。

如果你不能做到这两个,那么你可能需要聘请一位顾问来解决你的问题。。。

编辑:匿名/加扰的两个有用SO问题:

如何从私有数据创建示例数据集(用无信息的占位符替换变量名称和级别)?给定一组从连续单变量分布中抽取的随机数,找到分布

使用testthat包中的函数来显示预期发生的情况是一个好主意。因此,其他人可以更改您的代码,直到它运行无误。这减轻了那些想帮助你的人的负担,因为这意味着他们不必解码你的文本描述。例如

library(testthat)
# code defining x and y
if (y >= 10) {
    expect_equal(x, 1.23)
} else {
    expect_equal(x, 3.21)
}

这比“我认为如果y等于或超过10,x将为1.23,否则为3.21,但我都没有得到结果”更清楚。即使在这个愚蠢的例子中,我认为代码比单词更清楚。使用testthat可以让你的助手专注于代码,这节省了时间,并且可以让他们在发布问题之前知道他们已经解决了你的问题

到目前为止,对于再现性部分,答案显然很好。这只是为了澄清,一个可复制的例子不能也不应该是问题的唯一组成部分。别忘了解释你希望它看起来是什么样子,以及你的问题的轮廓,而不仅仅是你迄今为止试图达到的目的。代码不够;你也需要语言。

这里有一个可重复的例子来说明应该避免做什么(从一个真实的例子中得出,为了保护无辜者而改变了名字):


以下是示例数据和我遇到问题的部分函数。

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

我怎样才能做到这一点?


R-help邮件列表有一个发布指南,包括提问和回答问题,包括生成数据的示例:

示例:有时提供一个小例子实际上可以运行。例如:如果我有如下矩阵x:

  > 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
  >

如何将其转换为数据帧具有8行和3列“row”、“col”和“value”,它们具有维度名称为“row”和“col”的值,如下所示:

  > x.df
     row col value
  1    A   x      1

...(答案可能是:

  > 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")

)

“小”这个词特别重要。您应该以最小的可重复示例为目标,这意味着数据和代码应该尽可能简单地解释问题。

编辑:漂亮的代码比难看的代码更容易阅读。使用样式指南。

如果您有一个大数据集,无法使用dput()轻松放入脚本,请将数据发布到pastebin并使用read.table加载它们:

d <- read.table("http://pastebin.com/raw.php?i=m1ZJuKLH")

灵感来自Henrik。