基本上,一个最小可重现示例 (MRE) 应该能够让其他人在他们的机器上准确地重现您的问题。

MRE 由以下项目组成:

一个最小的数据集,是证明问题所必需的
重现错误所需的最小可运行代码,可以在给定数据集上运行
有关使用的软件包、R 版本和运行它的操作系统的所有必要信息。
在随机过程的情况下,种子(由 set.seed() 设置)用于可重复性
有关良好 MRE 的示例,请参阅您正在使用的函数的帮助文件底部的“示例”部分。 只需键入例如 help(mean) 或简短的 ?mean 进入您的 R 控制台。

提供最小数据集

通常,不需要共享庞大的数据集,而且可能会阻止其他人阅读您的问题。因此,最好使用内置数据集或创建一个类似于原始数据的小型“玩具”示例,这实际上就是最小的意思。如果出于某种原因您确实需要共享您的原始数据,您应该使用一种方法,例如 dput(),它允许其他人获取您的数据的精确副本。

内置数据集

您可以使用其中一种内置数据集。使用 data() 可以查看内置数据集的完整列表。每个数据集都有一个简短的描述,并且可以获得更多信息,例如使用 ?iris,用于 R 附带的“iris”数据集。安装的包可能包含其他数据集。

创建示例数据集

初步说明:有时您可能需要特殊格式(即类),例如因子、日期或时间序列。对于这些,请使用以下函数:as.factor、as.Date、as.xts、… 示例:

d <- as.Date("2020-12-30")

在哪?

class(d)
# [1] "Date"

向量

x <- rnorm(10)  ## random vector normal distributed
x <- runif(10)  ## random vector uniformly distributed    
x <- sample(1:100, 10)  ## 10 random draws out of 1, 2, ..., 100    
x <- sample(LETTERS, 10)  ## 10 random draws out of built-in latin alphabet

矩阵

m <- matrix(1:12, 3, 4, dimnames=list(LETTERS[1:3], LETTERS[1:4]))
m
#   A B C  D
# A 1 4 7 10
# B 2 5 8 11
# C 3 6 9 12

数据框

set.seed(42)  ## for sake of reproducibility
n <- 6
dat <- data.frame(id=1:n, 
                  date=seq.Date(as.Date("2020-12-26"), as.Date("2020-12-31"), "day"),
                  group=rep(LETTERS[1:2], n/2),
                  age=sample(18:30, n, replace=TRUE),
                  type=factor(paste("type", 1:n)),
                  x=rnorm(n))
dat
#   id       date group age   type         x
# 1  1 2020-12-26     A  27 type 1 0.0356312
# 2  2 2020-12-27     B  19 type 2 1.3149588
# 3  3 2020-12-28     A  20 type 3 0.9781675
# 4  4 2020-12-29     B  26 type 4 0.8817912
# 5  5 2020-12-30     A  26 type 5 0.4822047
# 6  6 2020-12-31     B  28 type 6 0.9657529

复制原始数据

如果您有特定原因,或者数据很难从中构建示例,您可以提供原始数据的一小部分,最好使用 dput。

为什么使用 dput()?

dput 会抛出在控制台上准确再现数据所需的所有信息。 您可以简单地复制输出并将其粘贴到您的问题中。

如果您在问题中共享它,则调用 dat(从上面)产生的输出仍然缺少有关变量类和其他功能的信息。 此外,类型列中的空格使其难以对其进行任何操作。 即使我们开始使用这些数据,我们也无法正确获取您数据的重要特征。

id       date group age   type         x
1  1 2020-12-26     A  27 type 1 0.0356312
2  2 2020-12-27     B  19 type 2 1.3149588
3  3 2020-12-28     A  20 type 3 0.9781675

子集您的数据

如果共享一个子集,请使用 head()、subset() 或索引 iris[1:4, ]。 然后将其包装到 dput() 中,以便为其他人提供可以立即放入 R 中的内容。 例子

dput(iris[1:4, ]) # first four rows of the iris data set

要在您的问题中分享的控制台输出:

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")), row.names = c(NA, 
4L), class = "data.frame")

使用 dput 时,您可能还希望仅包含相关列,例如 dput(mtcars[1:3, c(2, 5, 6)])

生成最少的代码
结合最少的数据(见上文),您的代码应该通过简单地复制和粘贴来准确地在另一台机器上重现问题。

这应该是容易的部分,但通常不是。你不应该做的事情:

显示各种数据转换;确保提供的数据已经采用正确的格式(当然,除非这是问题所在)
复制粘贴在某处出现错误的整个脚本。尝试找出导致错误的确切行。很多时候,你会发现问题出在自己身上。
你应该做什么:

如果您使用任何软件包,请添加您使用的软件包(使用 library())
test 在新的 R 会话中运行您的代码,以确保代码可运行。人们应该能够在控制台中复制粘贴您的数据和代码并获得与您相同的内容。
如果您打开连接或创建文件,请添加一些代码以关闭它们或删除文件(使用 unlink())
如果您更改选项,请确保代码包含将它们恢复为原始选项的语句。 (例如 op <- par(mfrow=c(1,2)) …一些代码… par(op) )
提供必要的信息
在大多数情况下,只需 R 版本和操作系统就足够了。当包发生冲突时,给出 sessionInfo() 的输出真的很有帮助。在谈论与其他应用程序的连接时(无论是通过 ODBC 还是其他任何方式),还应提供这些应用程序的版本号,如果可能,还应提供有关设置的必要信息。

如果您在 R Studio 中运行 R,则使用 rstudioapi::versionInfo() 可以帮助报告您的 RStudio 版本。

如果您对特定包有问题,您可能希望通过提供 packageVersion(“name of the package”) 的输出来提供包版本。