2016-06-07 28 views
1

我已經在我的工作環境中創建的對象的列表lapply和

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

我想這些文件到不同的目錄保存在變量名作爲目錄...所以R中保存功能我這樣做是爲了給我的文件名列表傳遞給通過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

備註:這裏是[類似SO問題,關於如何保存一系列'.csv'文件](http://stackoverflow.com/questions/37556184/write-csv-in-a- for-loop) –

回答

4

你有對象的列表,或名對象列表?你說你有前者,但你給的代碼是後者。另外,如果每個文件只有一個對象,那麼最好使用saveRDS函數(和loadRDS加載它)。

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函數提供了一個類似的錯誤,我已經得到了之前.. gzfile中的錯誤(文件,模式):無效的'description'參數 另外:警告消息: In if(file ==「」)stop(「'file'must be non-empty string」): 條件長度> 1,只有第一個元素將被使用 – cdcaveman

+0

我想使用lapply,但我真的必須使用save()不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]]) 
} 

最好是保存整個列表,然後所有的數據將在一個目錄中的一個文件中。

至於什麼實際上是你的代碼錯誤:

  • 您傳遞的filesave所有調用相同的值,並且不打算這樣做。這個值是一個向量,但是你想要的是每次迭代從這個向量中獲取一個元素。
  • 方式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變量1 /變量1.rda。所以你可以簡單地調用getSymbols.FI(「variable1」),這反過來用於其他調用buildSpread() – cdcaveman