2016-06-07 1 views
1

Я создал список объектов в моей рабочей средеlapply и функция сохранения в R

data <- c("variable1", "variable2", "variable3") 

я хотел бы сохранить файлы в разные каталоги с именем переменной в качестве каталога ... так я сделал это, чтобы дать мне список имен файлов, чтобы перейти к функции сохранения через lapply ..

paste0(data,"/",data,".rda") 


lapply(data,FUN=save,file = paste0(data,"/",data,".rda")) 

я получаю ошибку

Error in FUN(X[[i]], ...) : object ‘X[[i]]’ not found 

Я не уверен, что я делаю неправильно здесь.

+0

'lapply' используется там, где вы хотите получить список для возвращаемого значения каждой итерации, и не дает никаких преимуществ здесь. Вместо этого я бы предложил использовать 'for'. –

+0

Вы могли бы продемонстрировать @MatthewLundberg – cdcaveman

+0

сторона примечание: Здесь [аналогичный вопрос о том, как сохранить серию файлов '.csv'] (http://stackoverflow.com/questions/37556184/write-csv-in-a- for-loop) –

ответ

4

У вас есть список объектов , или список имен объектов? Вы говорите, что у вас есть первая, но код, который вы даете, для последнего.

Кроме того, если у вас есть только один объект в файле, то лучше использовать функцию saveRDSloadRDS, чтобы загрузить ее).

lapply(data, function(x) saveRDS(get(x), paste0(x, "/", x, ".rds"))) 

Если вы должны использовать save:

lapply(data, function(x) save(list=x, file=paste0(x, "/", x, ".rds"))) 
+0

Я думаю, что у него есть первый, но код не работает для этого случая. Кроме того, мой код также требует «saveRDS», так как он написан. –

+0

ваше право о бытии ... я составил список имен переменных, а не список переменных .. это была одна из моих проблем .. плюс эта предоставленная функция lapply дает аналогичную ошибку тем, которые я получил before ..Error в gzfile (файл, режим): недопустимый аргумент 'description' Кроме того: Предупреждающее сообщение: В if (file == "") stop ("'file' должен быть непустой строкой"): условие имеет длину> 1, и будет использоваться только первый элемент. – cdcaveman

+0

Я бы хотел использовать lapply, но мне действительно нужно использовать save() not saveRDS() – cdcaveman

2

Несколько вещей, происходящих здесь.

Во-первых, вам не нужно использовать lapply, когда вам не нужно возвращать значение функции, называемой на каждой итерации. В этом случае он ничего не предлагает.

Во-вторых, что более важно, вы делаете запись объектов в файлы с именами, полученными из их имен переменных в R. Это анти-шаблон.

Вместо этого создайте список объектов и используйте for для работы. Для этого нам нужно использовать saveRDS (спасибо Hong Ooi), так как l[[n]] также не является именем объекта в окружающей среде.

l <- list(variable1 = variable1, variable2 = variable2, variable3=variable3) 
for (n in names(l)) { 
    fname = paste0(n, '/', n, '.rda') 
    saveRDS(file=fname, l[[n]]) 
} 

Было бы лучше просто сохранить весь список, но тогда все данные будут находиться в одном файле в одном каталоге.

Что касается того, что на самом деле не так с вашим кодом:

  • Проходите одинаковое значение для file для всех вызовов save, и вы не намерены делать это. Это значение является вектором, но вы хотите, чтобы каждая итерация получала один элемент из этого вектора.
  • Способ lapply вычисляет значение, передаваемое функции, смущает save. В частности, он делает это:

names <- as.character(substitute(list(...)))[-1L]

Это приводит к чему-то вроде следующего, которое не является именем объекта в окружающей среде.

c("variable1", "variable2", "variable3")[[1]]

+0

произвольно, что вы используете «n» для итератора .. n в именах (l) что здесь n и l? – cdcaveman

+0

'l' вычисляется в строке над' for' и да, 'n' - произвольное имя. –

+0

Функция библиотеки (financialInstriments) getSymbols.FI() потребовала, чтобы файлы находились в .rda, а также для того, чтобы файл находился в папке с тем же именем .. IE variable1/variable1.rda. Чтобы вы могли просто вызвать getSymbols.FI («variable1»), который в свою очередь используется в других вызовах buildSpread() – cdcaveman

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

  • Нет связанных вопросов^_^