0

我每年都有一些变量,我想保存到磁盘以便以后检索。例子:

Yr.data <- list()

#Year 1
a <- "Year 1"
b <- 72
c <- matrix(1, nrow=2, ncol=2)
Yr.data[[1]] <- list(a=a, b=b, c=c)

#Year 2
a <- "Year 2"
b <- 99
c <- matrix(3, nrow=2, ncol=2)
Yr.data[[2]] <- list(a=a, b=b, c=c)

save (Yr.data, file="Yr_data.Rda")

rm(a,b,c,Yr.data)

然后稍后我想恢复这些变量,只用一年(例如第二年):

load("Yr_data.Rda")
# Here I want to "unlist" Yr.data[[2]], so I get a, b, c as separate variables
print(b)
[1] 99
c <- Yr.data[[2]]$c # I know this is a way to do it, but I want it automatically

有没有聪明的方法来做到这一点?既不用写a=a等保存变量,又不用专门指定要取出的变量。我每年要保存的真实数据要复杂得多(空间对象、数据框等)。我认为解决方案很简单,但不知何故我一直在寻找它......

谢谢。

/克里斯

更新:感谢您的帮助,我真的很感激。我意识到问题描述不够清楚。对于每一年(和测量点),我有例如变量 b 和 c(但每年有不同的值和测量点)。我需要将这些值保存到磁盘以供以后处理。b 例如可以是 list() 或 SpatialPolygonsDataFrame[] (不确定如何将其放入数据库)。我有其他 R 脚本来处理变量 b 和 c。复杂性是我想在同一个文件中多次保存“b”。所以我认为把它放在一个列表中很聪明:

Yr.data <- list()  
b <- 17
Yr.data[[1]] <-  list(b=b)
b <- 42
Yr.data[[2]] <- list(b=b) 

b <- Yr.data[[1]]$b # b becomes 17
# Or this, in case I need to analyze the second year
b <- Yr.data[[2]]$b # b becomes 42

这段代码可以做到,但我希望学习一种更强大的方法,以防我以后添加更多变量(例如第一年 d <- 34 和第二年 d <- 43)。

更新 2:我为解释不够清楚而道歉。我不想浪费你的时间。请允许我最后一次尝试。

我有一个处理输入变量 a、b、c 的 R 脚本。在我的示例中,这些变量很简单,但实际上它们是更复杂的对象,例如 sp::SpatialPolygonsDataFrame,因此我无法将它们放入数据框中。有时我需要处理一组变量,有时是另一组。我认为将这些不同的集合保存为列表中的列表很好,所以如果我想使用第一个集合运行,我选择列表列表中的第一个列表:

Year.I.need.to.analyze <- 1
getAllVariablesInList(Yr.data[[Year.I.need.to.analyze ]]) # creates a, b, c
result.I.want <- b * c

而当我需要分析第二年时,只需将“Year.I.need.to.analyze”更改为 2 并再次运行脚本即可。我宁愿不将每个集合保存在单独的 .Rda 文件中,以避免在文件名和目录上“greping”和“paste():ing”,也避免跟踪需要哪些文件等等。

我知道这个例子很简单,但真正的脚本必须在年份之间跳跃,在其间创建和导出情节,等等。我希望以一种强大的方式自动化所有这些。再次为混乱感到抱歉。经过几个小时的尝试解决这个问题,我意识到我可能太累了,无法以最好的方式解释这个问题。

4

3 回答 3

1

实现这一点的方法是使用 R 的数据库接口。有几个可供选择。MySQL 和 SQLite 都有经过良好测试的接口:

使用 R 的数据库的建议

在我看来,RSQLite 的另一个优势是它与 sqldf 包很好地集成在一起。

于 2012-06-22T15:52:31.900 回答
0

也许像

L3 <- LETTERS[1:3]
(d <- data.frame(cbind(x=1, y=1:10), fac=sample(L3, 10, replace=TRUE)))

## The same with automatic column names:
y<-data.frame(cbind(  1,   1:10),     sample(L3, 10, replace=TRUE))

dput(y,file='test.data')
rm(y)
y<-dget(file='test.data')

不知道我得到你的要求。

或尝试

dump(c("L3","y"),'test.data')
于 2012-06-22T15:46:39.513 回答
0

我终于设法做到了。也许使用应用功能会更好。再次感谢大家的支持。

Yr.data.x <- Yr.data[[1]]   #  Select year to work with

for (i in 1:length(Yr.data.x)) {
  name.i <- names(Yr.data.x)[i]
  value.i <- Yr.data.x[[i]]
  assign(name.i, value.i)
}
rm(i, name.i, value.i, Yr.data.x)

/克里斯

于 2012-06-24T22:15:48.490 回答