无法通过 replicate/dput 函数创建可重现的示例

Failure to create reproducible example by means of replicate/dput function

我正在尝试使用 dput() 创建一个具有大型数据库的可重现示例。数据库需要很大,因为可重现的例子涉及移动平均线。我发现执行此操作的方法涉及函数 reproduce,在此处共享 How to make a great R reproducible example? by @Ricardo Saporta. reproduce is based on dput() (code here https://github.com/rsaporta/pubR/blob/gitbranch/reproduce.R).

library(data.table) 
library(devtools)
source_url("https://raw.github.com/rsaporta/pubR/gitbranch/reproduce.R")

data <- read.table("http://pastebin.com/raw/xP1Zd0sC")
setDF(data)
reproduce(data, rows = c(1:100))

该代码创建 data 数据帧,然后为其提供 dput() 输出。它使用 rows 参数输出完整的数据帧。然而,如果我使用这样的输出来重新创建数据框,它会失败。

尝试将 dput() 输出分配给新数据框会导致代码不完整,需要我在末尾手动添加三个括号。这样做之后,我收到以下错误消息:"Error in View : arguments imply differing number of rows: 100, 61".

请注意,没有 rows = c(1:100) 参数的 reproducedput() 输出可以正常工作。它只是不输出完整的数据帧,而是输出一个样本。

#This works fine
reproduce(data)

另请注意,我使用 pastebin 方法创建了这个可重现的示例。出于我的目的,该方法不会取代 dput() 方法,因为每当尝试导入某些列在单词之间有空格的数据(例如带有日期时间戳的数据帧)时,它都会失败。

编辑: 经过进一步的故障排除后发现 reproducerows 参数与包含 [=60 的数据帧一起使用时如上所述失败=]4 列或更多列。将不得不寻找替代方案。

如果有人有兴趣对此进行测试,运行 上面的代码和以下链接,都包含不同数量的列:

1) 100x5: http://pastebin.com/raw/xP1Zd0sC

2) 100x4: http://pastebin.com/raw/YZtetfne

3) 100x4: http://pastebin.com/raw/63Ap2bh5

4) 100x3: http://pastebin.com/raw/1vMMcMtx

5) 100x3: http://pastebin.com/raw/ziM1bYQt

6) 100x1: http://pastebin.com/raw/qxtQs5u4

如果您只是想 dput() 数据集的前 100 行,那么您可以简单地对 运行 dput() 之前的数据进行子集化。似乎不需要使用链接功能。

dput(droplevels(head(data, 100)))  ## or dput(droplevels(data[1:100,]))

应该这样做。

但是,奇怪的是,您对 reproduce() 的尝试没有奏效。为此,我会在 github 页面上提出问题。您可能会在那里得到更有建设性的答案。

感谢@David Arenburg 提醒我 droplevels()。如果我们有因子列,它对这个操作很有用。 "Leftover" 个级别将被删除。