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