每次调用函数时,我都希望更改fout的默认值,将其替换为上次for循环结束时得到的fout值。
如下所示,我将fout的默认值设置为零,但每次调用函数时都未能更改默认值。
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”加起来。
发布于 2019-04-01 22:09:13
将fout变量的赋值更改为<<-,这会将变量设置为全局环境,然后在开始之前设置fout <- 0。
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变量作为参数,这样,
Rolltwicethenstop <- function(fout, sc, btt, sh, dout, dsel, dleft, porder)并返回变量fout,以及其他值,例如,将所有返回函数更改为
return(list(logic = FALSE, fout = fout))这在大多数情况下都是可行的。
Alternative method2
另一种方法是每次调用/定义变量fout时读取和写入一个文件,
例如,
首先创建一个值为0的文件,名为fout,
write.csv(0, "fout")这将在该位置创建一个文件,
getwd()然后可以使用以下方法读取该值,
read.csv("fout")[1,2]因此,编辑您的函数来读取和写入这些文件。
对于多个播放器,添加一个名为player.name的参数,然后不再调用文件'fout',而将其称为paste0(fout, player.name)。
https://stackoverflow.com/questions/55464218
复制相似问题