好的,所以我正在尝试使用S4类来构建一个非常复杂的对象,其中的插槽包括六个矩阵,几个列表,可能还有一个或两个厨房水槽。通过引用和解包我已经定义的配置对象来初始化该对象。使用setClass()定义类很容易,但是我很难找到在setMethod(“initialize”)中设置插槽的优雅方法。
问题是我需要根据该配置对象的部分设置这些六个矩阵的特定元素。对于配置对象的每个元素,我可能必须设置几个矩阵的特定元素。请注意,矩阵位于初始化函数的范围/环境中。然后我在initialize函数中有嵌套函数来执行对矩阵的实际赋值,或者无论如何都是这个想法。那些函数当然可以看矩阵,但它们不能修改它们,因为如果原始变量没有在当前定义中,< - 运算符会创建一个新矩阵环境。 R是按值传递,意思是它。对于我正在尝试初始化的.Object的插槽,这甚至是正确的。所以我不能使用嵌套函数来进行初始化。
不幸的是,这些嵌套函数必须修改几个矩阵,因此返回值并在主初始化函数中进行赋值是不实际或优雅的。 (但是有可能,如果我将矩阵的副本填充到返回的列表中,然后将它们组合在主初始化函数中。虽然很丑,但需要大量额外的代码。)
并且迭代(这将阻止此范围问题)也不是很实用,因为配置对象的层次结构本质,它真的希望通过递归调用遍历。
我能想到的最后一个选项是使用带有envir选项的assign()函数来强制赋值应用于非局部变量。但是使用这样的环境看起来很蹩脚,就像goto语句......
那么,最海盗的方法是什么?坚持使用纯函数式编程并构建丑陋的数据结构只是为了无效地传递冗余矩阵?尝试找到一个完全避免功能的迭代解决方案?通过玩环境来使用深层魔法?
答案 0 :(得分:1)
你看过<<-
了吗?它使得在父环境中的分配更容易一些。