首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何覆盖函数中的默认值集

如何覆盖函数中的默认值集
EN

Stack Overflow用户
提问于 2019-04-01 22:02:31
回答 1查看 61关注 0票数 0

每次调用函数时,我都希望更改fout的默认值,将其替换为上次for循环结束时得到的fout值。

如下所示,我将fout的默认值设置为零,但每次调用函数时都未能更改默认值。

代码语言:javascript
复制
Rolltwicethenstop <- function(sc, btt, sh, dout, dsel, dleft, porder)
{ 
  fout<-0
  for (i in 1:3)
  {
    if(dout[i]=="F")
    {
      fout=fout+1
    }
  }  
  if(fout+(13-length(dleft))>=6&btt>0)
  {
    return(FALSE)
  }else if(fout+(13-length(dleft))>=6&&btt>0&&sh>0)
  {
   return(FALSE)
  }else
  {
    return(TRUE)
  }
}

当我第一次调用函数时,fout的起始值为0,如果dout中有两个F,那么在for循环的结束时,fout=2.I期望使用fout=2作为第二次调用函数的开始值,并将游戏中所有回合的“F”加起来。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-01 22:09:13

fout变量的赋值更改为<<-,这会将变量设置为全局环境,然后在开始之前设置fout <- 0

代码语言:javascript
复制
fout <- 0

Rolltwicethenstop <- function(sc, btt, sh, dout, dsel, dleft, porder)
{ 
  for (i in 1:3)
  {
    if(dout[i]=="F")
    {
      fout<<-fout+1
    }
  }  
  if(fout+(13-length(dleft))>=6&btt>0)
  {
    return(FALSE)
  }else if(fout+(13-length(dleft))>=6&&btt>0&&sh>0)
  {
    return(FALSE)
  }else
  {
    return(TRUE)
  }
}

更多解释

现在,当您调用函数时,您将fout变量设置为0。这是一个问题,因为每次调用该函数时,都会将其设置为0。所以我们把它移到函数之外。

下一个问题是,当您将1添加到fout变量时,这只是在函数的环境中定义的,因此我们通过将变量赋值给global environment来改变这一点。

阅读有关环境和作用域这里的更多信息。

Alternative method1

我不确定您的特定框架,但另一种方法是在原始函数中添加fout变量作为参数,这样,

代码语言:javascript
复制
Rolltwicethenstop <- function(fout, sc, btt, sh, dout, dsel, dleft, porder)

并返回变量fout,以及其他值,例如,将所有返回函数更改为

代码语言:javascript
复制
return(list(logic = FALSE, fout = fout))

这在大多数情况下都是可行的。

Alternative method2

另一种方法是每次调用/定义变量fout时读取和写入一个文件,

例如,

首先创建一个值为0的文件,名为fout

代码语言:javascript
复制
write.csv(0, "fout")

这将在该位置创建一个文件,

代码语言:javascript
复制
getwd()

然后可以使用以下方法读取该值,

代码语言:javascript
复制
read.csv("fout")[1,2]

因此,编辑您的函数来读取和写入这些文件。

对于多个播放器,添加一个名为player.name的参数,然后不再调用文件'fout',而将其称为paste0(fout, player.name)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55464218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档