la中的lapply和save函数

时间:2016-06-07 00:56:29

标签: r lapply

我在工作环境中创建了一个对象列表

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

我不确定我在这里做错了什么..

2 个答案:

答案 0 :(得分: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")))

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