在 R 中,一般来说,函数不应该改变函数之外的东西。使用<<- 或assign() 可以做到这一点,但这通常会使您的函数不灵活并且非常令人惊讶。
相反,函数应该返回值(你的很好),如果你想保留这些值,你明确地使用<- 或= 将它们分配给函数之外的对象。他们现在构建你的函数的方式,你可以这样做:
updates = Reproduction(NetN = 1.07149, NetC = 0.0922349, cnrep = 20)
NetC = updates["NetC"]
这样,您 (a) 仍然将函数的所有其他结果存储在 updates 中,(b) 如果您想使用不同的输入集运行 Reproduction() 并比较结果,您可以这样做那。 (如果NetC 自动更新,您将永远看不到两个不同的值),(c)您可以更改变量名称并仍然使用相同的函数,(d)您可以运行该函数来试验/看看会发生什么无需保存/更新值。
如果您通常希望 NetN、NetC 和 cnrep 保持同步,我建议将它们放在一个命名向量或列表中,并重写您的函数以将该列表作为输入并返回列表作为输出。像这样的:
params = list(NetN = 1.07149, NetC = 0.0922349, cnrep = 20)
Reproduction=function(param_list){
NetN = param_list$NetN
NetC = param_list$NetC
cnrep = param_list$cnrep
if(NetC/NetN <= cnrep) {
DeltaC=NetC*p;
DeltaN=DeltaC/cnrep;
Crep=Crep+DeltaC;
Nrep=Nrep+DeltaN;
Brep=(Nrep*14+Crep*12)*2/1e6;
NetN=NetN-DeltaN; #/* Update N, C values */
NetC=NetC*(1-p)
print ("'Using C to allocate'")
}
else {
print("Using N to allocate");
DeltaN=NetN*p;
DeltaC=DeltaN*cnrep;
Nrep=Nrep+DeltaN;
Crep=Crep+DeltaC;
Brep=(Nrep*14+Crep*12)*2/1e6;
NetN=NetN*(1-p);
NetC=NetC-DeltaC;
}
## Removed extra } and ) ??
return(list(NetC=NetC, NetN=NetN, NewB=NewB, Crep=Crep, Nrep=Nrep, Brep=Brep))
}
这样,您可以使用单行 params <- Reproduction(params) 来更新列表中的所有内容。您可以使用params$Netc 或params[["NetC"]] 访问列表中的各个项目。