【问题标题】:Using a function to change a variable in R使用函数更改 R 中的变量
【发布时间】:2020-10-16 02:30:46
【问题描述】:

我正在尝试更改函数中的变量,但即使该函数产生了正确的值,当我在接下来的部分中使用它们时,R 仍在使用初始值。

我创建了一个函数来更新我的变量 NetN 和 NetC:

复制=函数(NetN,NetC,cnrep=20){
     如果(NetC/NetN

当我通过说做来使用我的功能时:

 复制(NetN=1.07149,NetC=0.0922349,cnrep=20)

我得到了想要的结果,其中包括:

NetC=7.378792e-02

但是,当我在下一部分代码中使用 NetC 时,R 仍在使用 NetC=0.0922349。

我可以让 R 更新 NetC 而无需定义新变量吗?

【问题讨论】:

  • 在 R 中,一般来说,函数不应该改变函数之外的东西。它们应该返回值(你的很好),如果你想保留这些值,它们会被分配。他们现在构建你的函数的方式,像updates <- Reproduction(...) 然后NetC <- updates["NetC"] 会起作用。

标签: r function loops variables


【解决方案1】:

在 R 中,一般来说,函数不应该改变函数之外的东西。使用<<-assign() 可以做到这一点,但这通常会使您的函数不灵活并且非常令人惊讶。

相反,函数应该返回值(你的很好),如果你想保留这些值,你明确地使用<-= 将它们分配给函数之外的对象。他们现在构建你的函数的方式,你可以这样做:

updates = Reproduction(NetN = 1.07149, NetC = 0.0922349, cnrep = 20)
NetC = updates["NetC"]

这样,您 (a) 仍然将函数的所有其他结果存储在 updates 中,(b) 如果您想使用不同的输入集运行 Reproduction() 并比较结果,您可以这样做那。 (如果NetC 自动更新,您将永远看不到两个不同的值),(c)您可以更改变量名称并仍然使用相同的函数,(d)您可以运行该函数来试验/看看会发生什么无需保存/更新值。

如果您通常希望 NetNNetCcnrep 保持同步,我建议将它们放在一个命名向量或列表中,并重写您的函数以将该列表作为输入并返回列表作为输出。像这样的:

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 &lt;- Reproduction(params) 来更新列表中的所有内容。您可以使用params$Netcparams[["NetC"]] 访问列表中的各个项目。

【讨论】:

  • 谢谢!应该将更新放在函数中,比如 next to return 还是不应该是函数的一部分而只是添加到下面的行中?
  • 不是函数的一部分 - 在下面的行中执行。
  • 谢谢,这真的很有帮助。 (另外,对于额外的 } 感到抱歉,这实际上是我的主循环中的一个嵌套循环,我显然没有正确传输它)
猜你喜欢
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多