R保存在函数内,保留原始输入名称

时间:2019-10-10 23:35:44

标签: r

我想使用输入对象的名称作为文件名保存在函数中

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")

2 个答案:

答案 0 :(得分:2)

您可以使用assigndat分配给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

请注意,我们需要将savelist一起使用,以强制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