Неспособность создать воспроизводимый пример с помощью функции репликации/вывода

Я пытаюсь использовать dput() для создания воспроизводимого примера с большой базой данных. База данных должна быть большой, так как воспроизводимый пример включает скользящие средние значения. Способ, который я нашел для этого, включает функцию reproduce, представленную здесь Как сделать отличный воспроизводимый пример R? от @Ricardo Saporta. reproduce основан на dput() (код здесь 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() для нового фрейма данных приводит к неполному коду, требующему, чтобы я вручную добавил три круглых скобки в конце. И после этого я получаю следующее сообщение об ошибке: «Ошибка в представлении: аргументы подразумевают разное количество строк: 100, 61».

Обратите внимание, что вывод dput() из reproduce без аргумента rows = c(1:100) работает нормально. Он просто выводит не полный кадр данных, а его образец.

#This works fine
reproduce(data)

Также обратите внимание, что для создания этого воспроизводимого примера я использовал метод pastebin. Этот метод не заменяет метод dput() для моих целей, потому что он терпит неудачу всякий раз, когда пытается импортировать данные, в которых некоторые столбцы имеют пробелы между словами (например, кадры данных с отметками даты и времени).

EDIT: после некоторого дальнейшего устранения неполадок было обнаружено, что reproduce не работает, как описано выше, когда аргумент rows используется вместе с фреймом данных, содержащим 4 или более столбцов. Придется искать альтернативу.

Если кто-то заинтересован в тестировании, запустите приведенный выше код со следующими ссылками, каждая из которых содержит разное количество столбцов:

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

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

3) 100 x 4: 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


person Krug    schedule 01.05.2016    source источник
comment
Попытка создать воспроизводимый пример для вопроса SO.   -  person Krug    schedule 01.05.2016
comment
Та же проблема с использованием rows=100.   -  person Krug    schedule 01.05.2016
comment
Спасибо, Ричард. dput() не позволяет указать количество строк. По крайней мере, нет упоминания об этом в его документации. Его вывод — несколько строк в начале и несколько в конце. Мне нужно вывести всю базу данных, а не образец.   -  person Krug    schedule 01.05.2016
comment
Потрясающий! Хотите поставить это как ответ? Я бы сэкономил много времени, если бы напрямую спросил, как заставить dput() выводить полную базу данных.   -  person Krug    schedule 01.05.2016


Ответы (1)


Если вы просто пытаетесь dput() обработать первые 100 строк набора данных, вы можете просто подмножить данные непосредственно перед запуском dput(). Кажется, нет необходимости использовать связанную функцию.

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

должен сделать это.

Однако странно, что ваша попытка на reproduce() не сработала. Я бы зарегистрировал проблему на странице github для этого. Скорее всего, там вы получите более конструктивный ответ.

Спасибо @David Arenburg за напоминание о droplevels(). Это полезно в этой операции, если у нас есть факторные столбцы. «Остаточные» уровни будут удалены.

person Rich Scriven    schedule 01.05.2016
comment
Теперь я понимаю, что преимущество replicate по сравнению с dput() заключается в том, что первый выводит все в одну строку, а dput() требует много редактирования, прежде чем делиться на SO. Жаль, что у replicate есть эта маленькая ошибка. - person Krug; 01.05.2016