Append = TRUE опция функции R dump()

Для исследования моделирования я хотел бы сохранить результаты одного образца в файле R, а затем добавить в этот файл результаты следующего образца.

Для этого я использую функцию dump(). Чтобы добавить файл с данными из следующей симуляции, я хочу использовать опцию append = TRUE этой функции. Однако эта функция у меня не работает.

Когда я имитирую данные, сохраняю их как файл R (используя функцию дампа), и я делаю это снова с опцией append = TRUE, функция дампа перезаписывает данные и не добавляет файл.

Что я делаю не так?

Чтобы проиллюстрировать проблему, это мой пример кода:

#Simulate data 
x <- rnorm(10)
y <- rnorm(10)
xy <- data.frame(x,y)

#Dump into R file "xy.R" with option append = TRUE
dump("xy",file="xy.txt", append =TRUE)
rm(xy)  # remove the dataset form current environment

#Retrieve data from file: 
source("xy.R")
xy #100 rows

#Run the code again: Still 100 rows and not 200 as expected. 
#Old data is overwritten, new data is not appended.

person Inga    schedule 05.06.2014    source источник


Ответы (1)


Вы действительно смотрели на выходной файл?

Дамп записывает имя переменной с присвоением в файл. Это означает, что когда вы запросите dump("xy"), он выпишет

xy <- ...

и когда вы запустите его снова, он добавит вывод в тот же файл, поэтому в итоге он напишет

xy <- ...
xy <- ...

Итак, вы только что дважды определили переменную xy, и последнее значение имеет преимущество. Параметр append не будет добавлять данные к каждому элементу файла, он просто добавит больше текста в конец файла. Вам нужно прочитать/объединить данные самостоятельно, прежде чем снова сбрасывать их.

Хотя, если вы сбрасываете data.frame, вам, вероятно, лучше использовать write.table и использовать append=T и read.table. Скорее всего, это правильное поведение для вас. Что-то типа

#Simulate data 
x <- rnorm(10)
y <- rnorm(10)
xy <- data.frame(x,y)

fn<-"xy.txt"
if(file.exists(fn)) {
    xy <- rbind(read.table(fn), xy)
}
write.table(xy,file=fn)
rm(xy)  # remove the dataset form current environment

#Retrieve data from file: 
xy <- read.table(fn)

Или, возможно,

#Simulate data 
x <- rnorm(10)
y <- rnorm(10)
xy <- data.frame(x,y)

fn<-"xy.txt"
if(file.exists(fn)) {
    write.table(xy, file=fn, row.names=F, col.names=F, append=T)
} else {
    write.table(xy, file=fn, row.names=F, col.names=T)
}
rm(xy)  # remove the dataset form current environment

#Retrieve data from file: 
xy <- read.table(fn, header=T)
person MrFlick    schedule 05.06.2014
comment
Использование как append(), так и rbind() преобразования текущих результатов в предыдущие результаты может быть излишним... Я подозреваю, что вы хотите сделать одно или другое, но не оба. (Кроме того, нужно быть осторожным с заголовками при добавлении...) - person Ben Bolker; 05.06.2014
comment
@BenBolker Хороший вопрос, Бен. Я торопился. Я думаю, что если я оставлю заголовки неуказанными, R поступит правильно. Верно? - person MrFlick; 05.06.2014
comment
@BenBolker На самом деле, append=T на write.table был беспорядок с заголовками и повторяющимися именами строк. Кажется, что read.table с rbind было безопаснее (но, возможно, не так эффективно) - person MrFlick; 05.06.2014
comment
Спасибо за ваши комментарии. Функция write.table действительно имеет более правильное поведение для меня (я вызываю функцию в пакетном сценарии и хотел бы сохранить все выходные данные параллельных симуляций в одном файле). Я попробовал предоставленный вами пример кода, но получаю следующую ошибку: Ошибка сканирования (файл, что, nmax, sep, dec, quote, skip, nlines, na.strings,: в строке 1 не было 6 элементов, я предполагаю что это связано с тем, что, как вы также упоминаете, в первых строках файла записано xy ‹- .... И все же я не знаю, как предотвратить эту ошибку. - person Inga; 05.06.2014
comment
@ Инга, я только что сделал еще одно редактирование. Это немного сложнее с атрибутами write.table, но если набор данных большой, вам не нужно сначала читать все существующие данные перед записью новых данных. Удачи. - person MrFlick; 05.06.2014
comment
@MrFlick Спасибо за редактирование. Я только что попробовал код, и он, кажется, работает отлично. Это очень помогает, это делает получение моих результатов намного более эффективным. - person Inga; 05.06.2014