我想使用输入对象的名称作为文件名保存在函数中
saveNew <- function(dat){
# Collect the original name
originalName <- deparse(substitute(dat))
#Do lots of Fun and Interesting Things!
#Now lets save it, First i have to get it
newToSave <- get(originalName, envir = .GlobalEnv)
save(newToSave, file = paste0(originalName, '.Rdata') )
}
但是问题是当我去保存它时,它将新创建的数据保存为newToSave
。当使用
load('funData.Rdata')
对象不再是funData
,而现在是newToSave
在下面的示例中,如何获取此函数以将其另存为funData
,并以fundata
而不是newToSave
的形式加载。
示例:
funData <- sample(seq(1,1000,.01))
saveNew(funData)
load("funData.Rdata")
答案 0 :(得分:2)
您可以使用assign
将dat
分配给originalName
saveNew <- function(dat){
# Collect the original name
originalName <- deparse(substitute(dat))
#Do lots of Fun and Interesting Things!
assign(originalName, dat)
save(list = originalName, file = paste0(originalName, '.Rdata') )
}
# Sample data
funData <- 1:10
# Save
saveNew(funData)
# Remove funData from the current environment
remove(funData)
# Load the RData object
load("funData.RData")
# Confirm that funData is in our current environment
funData
# [1] 1 2 3 4 5 6 7 8 9 10
请注意,我们需要将save
与list
一起使用,以强制save
写入已分配给originalName
的值。
答案 1 :(得分:1)
免责声明:这并不是真正的答案,但是由于OP希望进一步阐明saveRDS
的优缺点,所以我认为我可以将其放在答案下。 如果您认为应该将其删除,请在评论中注明(在降低投票之前),我很乐意将其撤回。
来自?saveRDS
:
详细信息:
这些函数提供了将单个R对象保存到连接(通常是文件)并恢复该对象的方法,很有可能使用不同的名称。这与“保存”和“加载”不同,后者将一个或多个命名对象保存并还原到环境中。它们本身被R本身广泛使用,例如,用于存储程序包的元数据和存储“ help.search”数据库:最常使用“ .rds”文件扩展名。
saveRDS
专门用于保存一个对象,而save
可以保存一个或多个对象,但是对我而言,主要区别在于save
和{ {1}}使用保存时的名称恢复了该对象的生命,因此其潜在的缺点之一是它可能重写环境中已有的一个对象,而load
及其同伴{{1} }可以将对象保存并加载到其他对象。
来自saveRDS
:
警告:
... “ load()”会在当前环境(通常是您的工作区“ .GlobalEnv”)中使用相同名称替换所有现有对象,因此有可能覆盖重要数据。使用“ envir =”加载到其他环境中,或者使用“ attach(file)”(将“ load()”插入到“搜索”路径中的新条目中),要安全得多。
考虑一下:
readRDS