将变量放入列表然后将其取回

时间:2012-06-22 15:17:15

标签: r

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

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&lt; -34第一年和d&lt; -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”,并且还要避免跟踪需要哪些文件等等。 / p>

我知道这个例子很简单,但真正的脚本必须在几年之间跳跃,在两者之间创建和导出图表,依此类推。我希望以强有力的方式自动化所有这些。 再次抱歉混乱。经过几个小时的努力解决这个问题,我意识到我可能太累了,不能以最好的方式解释这个问题。

3 个答案:

答案 0 :(得分:1)

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

Recommendations for database with R

RSQLite在我的脑海中具有额外的优势,它与sqldf包很好地集成。

答案 1 :(得分: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')

答案 2 :(得分:0)

我终于成功了。也许使用apply-function会更好。再次感谢所有支持。

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)

/克里斯