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

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

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

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


当前回答

指南:


你提出问题的主要目的应该是让读者尽可能容易地理解并在他们的系统上重现你的问题。为此:

提供输入数据提供预期输出简洁地解释您的问题如果您有超过20行的文本+代码,您可能可以回去简化尽可能简化代码,同时保留问题/错误

这确实需要一些工作,但这似乎是一种公平的权衡,因为你要求别人为你做工作。

提供数据:


内置数据集

到目前为止,最好的选择是依赖内置数据集。这使得其他人很容易解决您的问题。在R提示符下键入data()以查看您可以使用的数据。一些经典的例子:

虹膜地铁车厢ggplot2::钻石(外包装,但几乎每个人都有)

检查内置数据集以找到适合您问题的数据集。

如果你能用内置的数据集重新表述你的问题,你就更有可能得到好的答案(和支持)。

自行生成的数据

如果您的问题是特定于现有数据集中未表示的数据类型,请提供R代码,以生成您的问题所在的最小可能数据集。例如

set.seed(1)  # important to make random data reproducible
myData <- data.frame(a=sample(letters[1:5], 20, rep=T), b=runif(20))

试图回答我的问题的人可以复制/粘贴这两行,然后立即开始解决问题。

dput

最后,您可以使用dput将数据对象转换为R代码(例如dput(myData))。我说这是“最后的手段”,因为dput的输出通常相当笨拙,复制粘贴很烦人,并掩盖了您的其余问题。

提供预期输出:


有人曾经说过:

一张预期产出的图片值1000字--智者

如果您可以添加类似“我希望得到这个结果”的内容:

   cyl   mean.hp
1:   6 122.28571
2:   4  82.63636
3:   8 209.21429

对于你的问题,人们更容易理解你想快速做什么。如果您的预期结果很大且难以处理,那么您可能还没有充分考虑如何简化您的问题(见下一页)。

简洁地解释您的问题


主要要做的是在提问之前尽可能简化问题。在这方面,重新构建问题框架以使用内置数据集将有很大帮助。你也会经常发现,仅仅通过简化的过程,你就能回答自己的问题。

以下是一些好问题的示例:

内置数据集使用用户生成的数据

在这两种情况下,用户的问题几乎肯定与他们提供的简单示例无关。相反,他们抽象了问题的本质,并将其应用于一个简单的数据集,以提出问题。

为什么这个问题还有另一个答案?


这个答案侧重于我认为的最佳实践:使用内置数据集,并以最小的形式提供您期望的结果。最突出的答案侧重于其他方面。我不指望这个答案会上升到任何突出的位置;这只是为了让我可以在新手问题的评论中链接到它。

其他回答

最初的帖子指的是现已退役的数据营的小提琴演奏服务。它已被重新命名为数据营灯,不能像我的回答所示的那样容易嵌入。

我想知道http://old.r-fiddle.org/链接可能是分享问题的一种非常简单的方式。它接收一个唯一的ID,比如,甚至可以考虑将其嵌入SO中。

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

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

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

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

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

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

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

灵感来自Henrik。

通常,您需要一些数据作为示例,但是,您不想发布确切的数据。要在已建立的库中使用一些现有的data.frame,请使用data命令导入它。

例如。,

data(mtcars)

然后解决问题

names(mtcars)
your problem demostrated on the mtcars data set

要快速创建数据的dput,只需将数据复制到剪贴板,然后在R中运行以下命令:

对于Excel中的数据:

dput(read.table("clipboard", sep="\t", header=TRUE))

对于.txt文件中的数据:

dput(read.table("clipboard", sep="", header=TRUE))

如果需要,可以更改后者中的sep。当然,只有当您的数据在剪贴板中时,这才有效。