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