使用函数保存对象属性

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"

【讨论】:

以上是关于使用函数保存对象属性的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript高级 对象 函数 回调函数 IIFE

将对象表索引路径设置为对象属性?

函数的内部属性---Arguments对象

原型及继承

笔记008:原型

JavaScript中的Function类型总结