问题

在与同事讨论效果,教学,发送错误报告或在邮件列表中搜索指南时,请参阅可重现的示例< a>经常被问及总是有帮助.

您创建一个出色示例的提示是什么?如何从的问题粘贴数据结构格式?您应该包括哪些其他信息?

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

如何制作出色的可重复示例?



解决方法

最小可重现范例包含以下项目:

  • a minimal dataset, necessary to reproduce the error
  • the minimal runnable code necessary to reproduce the error, which can be run on the given dataset.
  • the necessary information on the used packages, R version and system it is run on.
  • in the case of random processes, a seed (set by set.seed()) for reproducibility

查看所使用函数的帮助文件中的示例通常很有帮助.一般来说,在那里给出的所有代码都满足最小可重复的例子的要求:提供数据,提供最小代码,一切都可运行.

Producing a minimal dataset

在大多数情况下,只需提供带有一些值的向量/数据框即可轻松完成此操作.或者,您可以使用大多数软件包提供的内置数据集.
使用 library(help ="datasets")可以看到内置数据集的完整列表.每个数据集都有一个简短的描述,可以通过?mtcars 获取更多信息,其中'mtcars'是列表中的数据集之一.其他包可能包含其他数据集.

制作向量很容易.有时,有必要向它添加一些随机性,并且有一些功能来实现. sample()可以随机化一个向量,或者给一个只有几个值的随机向量. 字母是一个有用的矢量包含字母表.这可以用于制定因素.

几个例子:

  • random values : x <- rnorm(10) for normal distribution, x <- runif(10) for uniform distribution, ...
  • a permutation of some values : x <- sample(1:10) for vector 1:10 in random order.
  • a random factor : x <- sample(letters[1:4], 20, replace = TRUE)

对于矩阵,可以使用 matrix(),例如:

matrix(1:10, ncol = 2)

使用 data.frame()可以完成数据帧.一个应该注意在数据框中的条目的名称,并不要使它过于复杂.

例如:

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

对于某些问题,可能需要特定格式.对于这些,可以使用任何提供的 as.someType 函数: as.factor , as.Date , as.xts ,...这些结合向量和/或数据框架的技巧.

Copy your data

如果你有一些数据太难以使用这些提示构建,那么你总是可以使用 head(), subset() 或指数.然后使用eg. dput()给我们一些可以立即放在R中的东西:

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

如果你的数据框有一个因子有很多级别, dput 输出可能是笨重的,因为它仍然会列出所有可能的因子级别,即使他们不在你的子集数据.为了解决这个问题,你可以使用 droplevels()函数.请注意以下物种是只有一个等级的因素:

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

dput 的另一个注意事项是它不适用于键控的 data.table 对象或分组 tbl_df (class grouping_df )from dplyr .在这些情况下,您可以在共享 dput(as.data.frame(my_data))之前转换回常规数据框.

最差的情况下,您可以使用 read.table text 参数来提供可以读取的文本表示形式:

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)

Producing minimal code

这应该是容易的部分,但往往不是.你不应该做的是:

  • add all kind of data conversions. Make sure the provided data is already in the correct format (unless that is the problem of course)
  • copy-paste a whole function / chunk of code that gives an error. First try to locate which lines exactly result in the error. More often than not you'll find out what the problem is yourself.

你应该做什么,是:

  • add which packages should be used if you use any.
  • if you open connections or make files, add some code to close them or delete the files (using unlink())
  • if you change options, make sure the code contains a statement to revert them back to the original ones. (eg op <- par(mfrow=c(1,2)) ...some code... par(op) )
  • test run your code in a new, empty R session to make sure the code is runnable. People should be able to just copy-paste your data and your code in the console and get exactly the same as you have.

Give extra information

在大多数情况下,只有R版本和操作系统就足够了.当包发生冲突时,给出 sessionInfo()的输出真的可以帮助.当谈到与其他应用程序的连接(通过ODBC或其他任何东西)时,还应该提供这些的版本号,如果可能还有设置的必要信息.




相关问题推荐