gpt4 book ai didi

r - 更新现有 Rdata 文件

转载 作者:行者123 更新时间:2023-12-02 02:38:55 28 4
gpt4 key购买 nike

我发现自己需要更新之前使用 save 创建的 Rdata 文件中的一两个数据对象。如果我不小心加载文件,我可能会忘记重新保存文件中的一些对象。举个例子,我正在开发一个包,其中包含一些存储在 sysdata.rda 中的对象(查找表供内部使用,我不想导出),并且只想担心更新单个对象对象。

我还没有弄清楚是否有标准方法可以做到这一点,因此创建了我自己的函数。

resave <- function (..., list = character(), file = stop("'file' must be specified")) {
# create a staging environment to load the existing R objects
stage <- new.env()
load(file, envir=stage)
# get the list of objects to be "resaved"
names <- as.character(substitute(list(...)))[-1L]
list <- c(list, names)
# copy the objects to the staging environment
lapply(list, function(obj) assign(obj, get(obj), stage))
# save everything in the staging environment
save(list=ls(stage, all.names=TRUE), file=file)
}

不过,这似乎有点矫枉过正。有没有更好/更简单的方法来做到这一点?

顺便说一句,我假设在函数范围内创建的新环境在函数调用后会被销毁,对吗?

最佳答案

这是一个稍微简短的版本:

resave <- function(..., list = character(), file) {
previous <- load(file)
var.names <- c(list, as.character(substitute(list(...)))[-1L])
for (var in var.names) assign(var, get(var, envir = parent.frame()))
save(list = unique(c(previous, var.names)), file = file)
}

我利用了 load 函数返回已加载变量的名称这一事实,因此我可以使用该函数的环境而不是创建一个环境。当使用 get 时,我很小心地只查看调用该函数的环境,即 parent.frame()

这是一个模拟:

x1 <- 1
x2 <- 2
x3 <- 3
save(x1, x2, x3, file = "abc.RData")

x1 <- 10
x2 <- 20
x3 <- 30
resave(x1, x3, file = "abc.RData")

load("abc.RData")
x1
# [1] 10
x2
# [1] 2
x3
# [1] 30

关于r - 更新现有 Rdata 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11813096/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com