2012-06-22 3 views
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 и т. Д. И без специального указания переменных для выхода. Реальные данные, которые я хочу сэкономить в год, намного сложнее (пространственные объекты, dataframes и т. Д.). Я думаю, что решение прост, но как-то я застрял в поиске ...

Спасибо.

/Chris

Update: Спасибо за усилия, чтобы помочь, я действительно ценю это. Я понимаю, что описание проблемы недостаточно ясное. Для каждого года (и точек измерения) у меня есть, например, переменные b и c (но с разными значениями в год и точками измерения). Эти значения мне нужно сохранить на диск для последующей обработки. b может быть, например, список() или 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 

Этот код делает это, но я надеялся узнать более надежный способ сделать это в случае, если позже добавить больше переменных (например, д < - 34 года и год < - 43 второй год).

Обновление 2: Приносим извинения за непонимание достаточно ясно. Я не хочу тратить время. Позвольте мне попробовать в последний раз.

У меня есть R-скрипт, обрабатывающий входные переменные a, b, c. В моих примерах эти переменные просты, но на самом деле они являются более сложными объектами, такими как sp :: SpatialPolygonsDataFrame, поэтому я не могу поместить их в dataframes. Иногда мне нужно обрабатывать один набор переменных, иногда другой. Я думал, что это хорошо, чтобы сохранить эти различные наборы как списки в списке, так что если я хочу работать с первым набором, я выбираю первый список в списке списков:

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» на имена файлов и каталогов, а также избегать отслеживания файлов и т. Д.

Я знаю, что пример прост, но реальный сценарий должен прыгать между годами, создавать и экспортировать графики между ними и т. Д. Я надеялся максимально автоматизировать все это. Снова извините за путаницу. Спустя несколько часов, пытаясь исправить это, я понимаю, что, возможно, слишком устал, чтобы наилучшим образом объяснить этот вопрос.

+0

'сохранить (а, б, в, файл = "Yr1_data.Rda")', и т.д.? Я не могу сказать, что вы здесь делаете. – joran

+0

Извините, я должен был упомянуть по соображениям надежного кода. Я хочу, чтобы все годы в одном файле. Мне нужно сохранять данные в течение многих лет. – Chris

+0

Я бы предпочел использовать среду вместо списка, но это было бы совсем не так. например 'e <- as.environment (Yr.data, recursive = FALSE); Ls (е); е $ с; с (e, b); get ("c", pos = e) ' – GSee

ответ

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) 

/Chris

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') 
1

Путь для достижения этой цели является использование интерфейса базы данных для R. Есть несколько на выбор. И MySQL и SQLite были хорошо протестированы интерфейсы:

Recommendations for database with R

RSQLite будет иметь дополнительное преимущество в моем уме, что он хорошо интегрируется с пакетом sqldf.

Смежные вопросы