我尝试使用dput()
创建一个包含大型数据库的可重现示例。数据库需要很大,因为可重现的示例涉及移动平均值。我发现这样做的方式涉及@Ricardo Saporta在reproduce
共享的函数reproduce
。 dput()
基于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
答案 0 :(得分:2)
如果您只是尝试dput()
数据集的前100行,那么您可以在运行dput()
之前简单地对数据进行子集化。似乎没有必要使用链接功能。
dput(droplevels(head(data, 100))) ## or dput(droplevels(data[1:100,]))
应该这样做。
但是,你reproduce()
的尝试不起作用是很奇怪的。我会在github页面上提出一个问题。你可能会在那里得到一个更有建设性的答案。
感谢@David Arenburg提醒我droplevels()
。如果我们有因子列,它对此操作很有用。 “剩余”水平将被取消。