【问题标题】:Append = TRUE option of the R dump() functionR dump() 函数的 Append = TRUE 选项
【发布时间】:2014-07-26 13:24:17
【问题描述】:

对于模拟研究,我想将一个样本的结果保存在 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.

【问题讨论】:

    标签: r append dump


    【解决方案1】:

    你真的看过输出文件吗?

    Dump 将带有赋值的变量名写入文件。这意味着当您要求dump("xy") 时,它会写出

    xy <- ...
    

    当你再次运行它时,它会将输出附加到同一个文件中,所以它最终会写入

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

    所以你刚刚定义了变量xy 两次,最后一个值获胜。 append 选项不会将数据附加到文件中的每个元素,它只是在文件末尾添加更多文本。在再次转储数据之前,您需要自己读取/合并数据。

    不过,如果您要转储 data.frame,您可能会更好地使用 write.tableappend=Tread.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)
    

    【讨论】:

    • 同时使用 append()rbind() 将当前结果用于先前的结果可能是多余的......我怀疑你想做一个或另一个,但不是两者都做。 (另外,附加时需要小心标题...)
    • @BenBolker Ben 好点。我很着急。我认为如果我不指定标题,R 会做正确的事情。对吗?
    • @BenBolker 实际上,write.table 上的 append=T 是一团糟的标题和重复的行名。似乎 read.tablerbind 更安全(但可能效率不高)
    • 感谢您的 cmets。 write.table 函数对我来说确实具有更正确的行为(我在批处理脚本中调用该函数,并希望将并行模拟的所有输出保存在一个文件中)。我尝试了您提供的示例代码,但出现以下错误: 扫描错误(文件,内容,nmax,sep,dec,引用,跳过,nlines,na.strings,:第 1 行没有我假设的 6 个元素这与您也提到的事实有关,xy
    • @Inga 我刚刚又做了一个编辑。 write.table 属性有点繁琐,但是如果数据集很大,则无需在写入新数据之前先读取所有现有数据。祝你好运。
    猜你喜欢
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2015-10-11
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多