在函数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
}
答案 0 :(得分:2)
可能没有比你已经拥有的更好的练习了。
函数式编程语言(如R)通常不允许函数修改输入参数。
此外,R函数只返回一个对象,因此返回包含对象A,B和C的列表也是正确的方法。
答案 1 :(得分:0)
很难从你的玩具示例中看出来,但似乎你有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))
}