无法通过复制/输出功能创建可重现的示例

时间:2016-05-01 18:38:05

标签: r import reproducible-research

我尝试使用dput()创建一个包含大型数据库的可重现示例。数据库需要很大,因为可重现的示例涉及移动平均值。我发现这样做的方式涉及@Ricardo Saporta在reproduce共享的函数reproducedput()基于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)) (此处代码为How to make a great R reproducible example?)。

data

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

尝试将dput()输出分配给新数据帧会导致代码不完整,要求我在最后手动添加三个括号。在这样做之后,我收到以下错误消息:“视图中的错误:参数意味着不同的行数:100,61”。

请注意,reproduce没有rows = c(1:100)参数的#This works fine reproduce(data) 输出正常。它只是不输出完整的数据帧,而是输出它的样本。

dput()

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

编辑经过一些进一步的故障排除后发现rows如上所述,当private void createScene(String[] columnNames, String[][] inputData) { TableView<List<String>> table = new TableView<>(); table.setEditable(false); for (int i = 0; i < columnNames.length; i++) { TableColumn<List<String>, String> column = new TableColumn<>(columnNames[i]); final int colIndex = i ; column.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().get(colIndex))); table.getColumns().add(column); } List<List<String>> data = new ArrayList<List<String>>(); for (int i = 0; i < inputData.length; i++) { List<String> row = new ArrayList<String>(); for (int j = 0; j < inputData[0].length; j++) { row.add(inputData[i][j]); } data.add(row); } ObservableList<List<String>> inpData = FXCollections.observableArrayList(data); table.setItems(inpData); table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); VBox vbox = new VBox(); vbox.setSpacing(5); vbox.setPadding(new Insets(10, 0, 0, 10)); vbox.getChildren().add(table); Scene scene = new Scene(vbox, 500, 500); jfxPanel.setScene(scene); } 参数与包含 4列或更多列的数据框一起使用时失败/ strong>即可。将不得不寻找替代方案。

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

1)100x5:https://github.com/rsaporta/pubR/blob/gitbranch/reproduce.R

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

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

4)100x3:http://pastebin.com/raw/63Ap2bh5

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

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

1 个答案:

答案 0 :(得分:2)

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

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

应该这样做。

但是,你reproduce()的尝试不起作用是很奇怪的。我会在github页面上提出一个问题。你可能会在那里得到一个更有建设性的答案。

感谢@David Arenburg提醒我droplevels()。如果我们有因子列,它对此操作很有用。 “剩余”水平将被取消。