无法通过 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)
参数的 reproduce
的 dput()
输出可以正常工作。它只是不输出完整的数据帧,而是输出一个样本。
#This works fine
reproduce(data)
另请注意,我使用 pastebin 方法创建了这个可重现的示例。出于我的目的,该方法不会取代 dput()
方法,因为每当尝试导入某些列在单词之间有空格的数据(例如带有日期时间戳的数据帧)时,它都会失败。
编辑: 经过进一步的故障排除后发现 reproduce
在 rows
参数与包含 [=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" 个级别将被删除。
我正在尝试使用 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)
参数的 reproduce
的 dput()
输出可以正常工作。它只是不输出完整的数据帧,而是输出一个样本。
#This works fine
reproduce(data)
另请注意,我使用 pastebin 方法创建了这个可重现的示例。出于我的目的,该方法不会取代 dput()
方法,因为每当尝试导入某些列在单词之间有空格的数据(例如带有日期时间戳的数据帧)时,它都会失败。
编辑: 经过进一步的故障排除后发现 reproduce
在 rows
参数与包含 [=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" 个级别将被删除。