как покрыть значение по умолчанию, установленное внутри функции - PullRequest
0 голосов
/ 02 апреля 2019

Я хочу менять значение fout по умолчанию каждый раз, когда я вызываю функцию, заменяя ее значением fout, полученным в конце цикла for в прошлый раз

То, что я пробовал, показано ниже,Я установил значение по умолчанию для 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. Я ожидаю использовать fout = 2 в качестве начального значения во второй раз, когда я вызываю функцию, и складываю все "Я получил всего за все раунды в игре.

1 Ответ

1 голос
/ 02 апреля 2019

Измените свои присвоения переменной 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.

Подробнее о средах и области применения здесь .

Альтернативный метод1

Я не уверен насчет вашей конкретной структуры, но другой подход заключается в добавлении переменной fout в качестве аргумента в исходную функцию таким образом, чтобы

Rolltwicethenstop <- function(fout, sc, btt, sh, dout, dsel, dleft, porder)

и вернуть переменную fout вместе с другими значениями, например, изменить все возвращаемые функции на эту,

return(list(logic = FALSE, fout = fout))

Это должно работать для большинства целей.

Альтернативный метод2

Другим методом будет чтение и запись файла каждый раз, когда переменная fout вызывается / определяется,

Например,

Сначала создайте файл со значением 0, который называется fout,

write.csv(0, "fout")

Это создаст файл в папке,

getwd()

Затем вы можете прочитать значение обратно, используя следующее,

read.csv("fout")[1,2]

Поэтому отредактируйте свою функцию, чтобы читать и записывать эти файлы.

Для нескольких игроков добавьте аргумент под названием player.name, затем вместо вызова файла 'fout' назовите его paste0(fout, player.name).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...