r - 嵌套函数的复杂对象初始化范围问题

标签 r functional-programming scope pass-by-value s4

好的,所以我试图使用S4类来构建一个非常复杂的对象,其插槽包括六个矩阵,几个列表,并且可能还有一个或两个厨房水槽。通过引用并解包我已经定义的配置对象来初始化该对象。用setClass()定义类很容易,但是我很难弄清楚在setMethod(“initialize”)中设置插槽的优雅方法。

问题是我需要根据该配置对象的各个部分来设置这些六个矩阵的特定元素。对于配置对象的每个元素,我可能必须设置几个矩阵的特定元素。请注意,矩阵在初始化函数的范围/环境中。然后,我在initialize函数中具有嵌套函数,这些函数对矩阵进行实际分配,或者无论如何就是这样。这些函数当然可以看到矩阵,但是它们不能修改它们,因为如果在当前环境中 undefined 原始变量,则<-运算符会创建一个新矩阵。 R是传递值,表示它。对于我尝试初始化的.Object插槽,甚至都是如此。因此,我无法使用嵌套函数进行初始化。

不幸的是,这些嵌套函数必须修改几个矩阵,因此在主初始化函数中返回值并进行赋值既不实用也不优雅。 (但是有可能,如果我将矩阵的副本填充到返回的列表中,然后将它们组合到主要的initial函数中。尽管如此,这很麻烦,并且需要大量额外的代码。)

而且,由于配置对象的分层性质(实际上希望通过递归调用进行遍历),迭代(这将避免此范围问题)也不是很实用。

我能想到的最后一个选项是使用带有envir选项的assign()函数来强制将赋值应用于非局部变量。但是使用像goto语句这样的环境似乎很棘手...

那么,最实用的方法是什么?坚持纯函数式编程并构建丑陋的数据结构,只是为了低效地传递冗余矩阵?试图找到一个完全避免使用函数的迭代解决方案?通过玩环境使用深奥的魔法?

最佳答案

您看过<<-吗?这使得在父环境中进行分配更加容易。

关于r - 嵌套函数的复杂对象初始化范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1586744/

相关文章:

r - 在一个包中,如何使用 Rcpp 调用该包中的 R 函数?

regex - R 中的变音符号和正则表达式

c# - C#/.NET 中文件级别的函数作用域?

闭包函数内部 'this' 范围的 Javascript 混淆

class - 我无法从 Kotlin 的嵌套类中联系到任何类成员

r - 使用 RJDBC 将数据帧写入 Teradata 表

Rmarkdown,Rstudio : pandoc. exe:从 TeX 源代码生成 PDF 时出错

python - 如何在嵌套列表中查找给定元素?

haskell - 用于进度跟踪的 Monad 转换器

javascript - 功能组合javascript