lapply 和 R 中的保存函数
lapply and the save function in 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
我不确定我做错了什么..
这里发生了几件事。
首先,当您不关心每次迭代调用的函数的 return 值时,您不需要使用 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]]
您是否有 对象 的列表,或 名称 对象的列表?你说你有前者,但你给的代码是给后者的。
此外,如果每个文件只有一个对象,那么最好使用 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")))
我已经在我的工作环境中创建了一个对象列表
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
我不确定我做错了什么..
这里发生了几件事。
首先,当您不关心每次迭代调用的函数的 return 值时,您不需要使用 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]]
您是否有 对象 的列表,或 名称 对象的列表?你说你有前者,但你给的代码是给后者的。
此外,如果每个文件只有一个对象,那么最好使用 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")))