简体   繁体   English

如何使用R将向量作为行添加到已保存的.RData文件中

[英]How to append a vector as a row in a saved .RData file with R

The question a bit self explanatory but I should add that I do not want to load the file. 这个问题有点自我解释,但是我要补充一点,我不想加载文件。 I'm looking for something like append = TRUE for saving a .RData file . 我正在寻找类似append = TRUE的文件来保存.RData文件。 I want to do something like this: 我想做这样的事情:

save(df, file="mtcars.Rda",append = TRUE)

Here is a reproducible example: 这是一个可重现的示例:

# load data
  data("mtcars")
  head(mtcars)

# save original DF
  save(mtcars, file="mtcars.Rdata")

# create another DF
  df <- mtcars

# append DF to a saved Rdata file
  save(df, file="mtcars.Rdata",append = TRUE)

Error in save(df, file = "mtcars.Rdata", append = TRUE) : object 'TRUE' not found 保存错误(df,file =“ mtcars.Rdata”,append = TRUE):找不到对象'TRUE'

AFAIK, You'll have to load file to make changes in saved objects and then save those objects again. AFAIK,您必须load文件才能对已保存的对象进行更改,然后再次保存这些对象。 You can't even view names of objects stored without loading, let alone modifying contents. 您甚至无法查看未加载的存储对象的名称,更不用说修改内容了。

If you want a one-line solution, you can write a function. 如果您需要单行解决方案,则可以编写一个函数。

appendToFile <- function(newRow, savedFile){
    load(savedFile, new.env())
    df = rbind(df, newRow)
    save(df, file = savedFile)
}

df <- data.frame(x = 1:5, y = 6:10)
save(df, file = "file.RData")
appendToFile(c(50, 100), "file.RData")

# Check if changes are saved
load("file.RData")
tail(df, 3)
##   x   y
##4  4   9
##5  5  10
##6 50 100

SOmething like this may help for adding new objects to an existing .Rdata file: 这样的事情可能有助于将新对象添加到现有的.Rdata文件中:

add_object_to_rda <- function(obj, rda_file, overwrite = FALSE) {
    .dummy <- NULL
    if (!file.exists(rda_file)) save(.dummy, file = rda_file)

    old_e <- new.env()
    new_e <- new.env()

    load(file = rda_file, envir = old_e)

    name_obj <- deparse(substitute(obj))   # get the name of the object

    # new_e[[name_obj]] <- get(name_obj)     # use this only outside a function
    new_e[[name_obj]] <- obj

    # merge object from old environment with the new environment
    # ls(old_e) is a character vector of the object names
    if (overwrite) {
        # the old variables take precedence over the new ones
        invisible(sapply(ls(new_e), function(x)
            assign(x, get(x, envir = new_e), envir = old_e)))
        # And finally we save the variables in the environment
        save(list = ls(old_e), file = rda_file, envir = old_e)
    }
    else {
        invisible(sapply(ls(old_e), function(x)
            assign(x, get(x, envir = old_e), envir = new_e)))
        # And finally we save the variables in the environment
        save(list = ls(new_e), file = rda_file, envir = new_e)
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM