在与同事讨论绩效、教学、发送错误报告或搜索邮件列表和Stack Overflow上的指导时,经常会询问一个可重复的示例,并且总是很有用。
你有什么建议来创建一个优秀的例子?如何以文本格式粘贴r中的数据结构?您还应包括哪些其他信息?
除了使用dput()、dump()或structure()之外,还有其他技巧吗?什么时候应该包含library()或require()语句?除了c、df、data等之外,应该避免哪些保留字。?
如何做出一个伟大的、可重复的例子?
在与同事讨论绩效、教学、发送错误报告或搜索邮件列表和Stack Overflow上的指导时,经常会询问一个可重复的示例,并且总是很有用。
你有什么建议来创建一个优秀的例子?如何以文本格式粘贴r中的数据结构?您还应包括哪些其他信息?
除了使用dput()、dump()或structure()之外,还有其他技巧吗?什么时候应该包含library()或require()语句?除了c、df、data等之外,应该避免哪些保留字。?
如何做出一个伟大的、可重复的例子?
当前回答
通常,您需要一些数据作为示例,但是,您不想发布确切的数据。要在已建立的库中使用一些现有的data.frame,请使用data命令导入它。
例如。,
data(mtcars)
然后解决问题
names(mtcars)
your problem demostrated on the mtcars data set
其他回答
到目前为止,对于再现性部分,答案显然很好。这只是为了澄清,一个可复制的例子不能也不应该是问题的唯一组成部分。别忘了解释你希望它看起来是什么样子,以及你的问题的轮廓,而不仅仅是你迄今为止试图达到的目的。代码不够;你也需要语言。
这里有一个可重复的例子来说明应该避免做什么(从一个真实的例子中得出,为了保护无辜者而改变了名字):
以下是示例数据和我遇到问题的部分函数。
code
code
code
code
code (40 or so lines of it)
我怎样才能做到这一点?
以下是我的一些建议:
尝试使用默认的R数据集如果您有自己的数据集,请将其包含在dput中,这样其他人可以更轻松地帮助您除非确有必要,否则不要使用install.package(),人们会理解您是否只使用require或library尽量简明扼要,有一些数据集尽量简单地描述您需要的输出问问题之前自己做上传图片很容易,所以如果你有还包括您可能遇到的任何错误
所有这些都是可复制示例的一部分。
(这是我如何写一个可复制的例子的建议。我试图让它简短而甜蜜)。
如何编写可复制的示例
如果你提供了一个可重复的例子,你最有可能在R问题上得到很好的帮助。一个可复制的示例允许其他人通过复制和粘贴R代码来重新创建您的问题。
为了使示例具有可复制性,您需要包括四个方面:所需的包、数据、代码和R环境的描述。
包应该在脚本的顶部加载,因此很容易看看示例需要哪些。在电子邮件或堆栈溢出问题中包含数据的最简单方法是使用dput()生成R代码以重新创建它。例如,要在R中重新创建mtcars数据集,我将执行以下步骤:在R中运行dput(mtcars)复制输出在我的可复制脚本中,键入mtcars<-然后粘贴。花一点时间确保您的代码易于其他人使用内容如下:确保使用了空格,变量名称简洁,但是提供有用信息的使用注释指出问题所在尽最大努力删除与问题无关的所有内容。代码越短,越容易理解。在代码的注释中包含sessionInfo()的输出。这总结了您的R环境,并使其易于检查您是否使用了过时的包裹
您可以通过启动一个新的R会话并粘贴脚本来检查是否确实制作了一个可复制的示例。
在将所有代码放入电子邮件之前,请考虑将其放在Gistgithub上。它会给你的代码提供很好的语法高亮显示,你不必担心任何东西会被电子邮件系统破坏。
使用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可以让你的助手专注于代码,这节省了时间,并且可以让他们在发布问题之前知道他们已经解决了你的问题
我有一个非常简单和有效的方法来制作上面没有提到的R示例。你可以先定义你的结构。例如
mydata <- data.frame(a=character(0), b=numeric(0), c=numeric(0), d=numeric(0))
>fix(mydata)
然后您可以手动输入数据。这对于较小的示例而不是较大的示例是有效的。