使用函数保存对象属性
Posted
技术标签:
【中文标题】使用函数保存对象属性【英文标题】:Saving object attributes using a function 【发布时间】:2018-03-29 13:13:02 【问题描述】:我正在尝试修改 save() 函数,以便将源自对象的脚本存储为对象的属性。
s = function(object, filepath, original.script.name)
#modified save() function
#stores the name of the script from which the object originates as an attribute, then saves as normal
attr(object, "original.script") = original.script.name
save(object, file = filepath)
示例:
testob = 1:10
testob
# [1] 1 2 3 4 5 6 7 8 9 10
s(testob, filepath = "rotation1scripts_v4/saved.objects/testob", "this.is.the.name")
load(file = "rotation1scripts_v4/saved.objects/testob")
testob
# [1] 1 2 3 4 5 6 7 8 9 10
attributes(testob)
# NULL
进一步调查,似乎没有将对象加载到环境中:
testob2 = 1:5
testob2
# [1] 1 2 3 4 5
s(testob2, "rotation1scripts_v4/saved.objects/testob2", "this.is.the.name")
rm(testob2)
load(file = "rotation1scripts_v4/saved.objects/testob2")
testob2
# Error: object 'testob2' not found
为什么它不起作用?
【问题讨论】:
寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。你究竟是如何调用这个函数的?你如何验证属性没有被保留? 嗨 MrFlick,例如查看更新后的帖子。谢谢 【参考方案1】:你需要小心save()
。它保存传递给save()
的同名变量。因此,当您调用save(object, ...)
时,它会将变量保存为“object”而不是您似乎期望的“testob”。你可以做一些非标准的环境改组来完成这项工作。试试
s <- function(object, filepath, original.script.name)
objectname <- deparse(substitute(object))
attr(object, "original.script") = original.script.name
save_envir <- new.env()
save_envir[[objectname]] <- object
save(list=objectname, file = filepath, envir=save_envir)
我们使用deparse(substitute())
来获取传递给函数的变量的名称。然后我们创建一个新环境,我们可以在其中创建具有相同名称的对象。这样我们可以在实际保存对象时使用该名称。
如果我们使用
进行测试,这似乎可以工作testob <- 1:10
s(testob, filepath = "test.rdata", "this.is.the.name")
rm(testob)
load(file = "test.rdata")
testob
# [1] 1 2 3 4 5 6 7 8 9 10
# attr(,"original.script")
# [1] "this.is.the.name"
【讨论】:
以上是关于使用函数保存对象属性的主要内容,如果未能解决你的问题,请参考以下文章