R: 功能中的功能:管理环境

  • 本文关键字:功能 环境 管理 r
  • 更新时间 :
  • 英文 :


在函数A中,我有一个函数B,它从函数A的环境中获取4个对象并对它们进行修改。然后,我需要将这些对象发送回函数A的环境。

我正在寻找最佳实践建议:目前我所做的是:函数B返回一个包含对象的列表,每个对象都会在函数a的环境中被覆盖。有更好的方法来处理这个问题吗?关于管理环境的讨论相当复杂,这对社区来说是一个重要而简单的问题。

下面是我实现的一些伪代码

Function A = getObjects(A,B,C){
A= A+1
B= B+1
C= C+1
# Function B returns a list containing the object after certain operations were # performed on these
listFromFunctionB =  FunctionB(A,B,C)
A = listFromFunctionB$A
B = listFromFunctionB$B
C = listFromFunctionB$C
#Other operations keep going on objects A,B and C
}

也许没有比你已经掌握的更好的实践了。

函数式编程语言(如R)通常不允许函数修改输入参数。

此外,R函数只返回一个对象,因此返回包含对象A、B和C的列表也是正确的方法。

很难从你的玩具示例中分辨出来,但似乎你有3个对象,A、B和C,它们都是一起操作和传递的。在这个过程的每一步,你都会将它们从列表中取出,对它们中的每一个都做些什么,然后将它们放回列表中,这样它们就可以作为一个函数返回。

一般来说,这是好的。不能返回多个对象,因此需要在列表中返回它们。每次都会把它们从列表中删除。为什么要麻烦?

事实上,使用lapply,对列表中的每个项目执行相同的操作非常容易。您的代码使其看起来像是在复制/粘贴行,并将A更改为B,然后更改为C。好的编程应该只需要很少的复制/粘贴。

与其编写A, B, C的函数,不如编写期望list(A, B, C)作为输入的函数。

做某事的唯一例子是在A、B和C中添加一个。以下是如果它们在列表中,您将如何做到这一点:

FunctionA = function(ABClist) {
    # add 1 to each list element
    return(lapply(ABClist, function(x) x + 1))
}

最新更新