我在工作环境中创建了一个对象列表
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 :(得分: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]]