Опция 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 записва името на променливата с присвояването на файла. Това означава, че когато поискате 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 наистина има по-правилното поведение за мен (извиквам функцията в пакетен скрипт и бих искал да запазя целия изход от паралелните симулации в един файл). Опитах примерния код, който предоставихте, но получавам следната грешка: Грешка при сканиране (file, what, nmax, sep, dec, quote, skip, nlines, na.strings,: ред 1 не съдържа 6 елемента, предполагам че това е свързано с факта, че както споменахте, xy ‹- ... е записано в първите редове на файла.Все пак не знам как да предотвратя тази грешка. - person Inga; 05.06.2014
comment
@Inga Току-що направих още една редакция. Малко по-трудно е с атрибутите write.table, но ако наборът от данни е голям, няма да е необходимо първо да четете всички съществуващи данни, преди да напишете новите данни. Късмет. - person MrFlick; 05.06.2014
comment
@MrFlick Благодаря за редакцията. Току-що пробвах кода и изглежда, че работи перфектно. Това помага много, прави извличането на моите резултати много по-ефективно. - person Inga; 05.06.2014