как покрыть значение по умолчанию, установленное внутри функции

#r #for-loop

#r #для цикла

Вопрос:

Я хочу изменять значение по умолчанию для 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))>=6amp;btt>0)
  {
    return(FALSE)
  }else if(fout (13-length(dleft))>=6amp;amp;btt>0amp;amp;sh>0)
  {
   return(FALSE)
  }else
  {
    return(TRUE)
  }
}
  

начальное значение fout равно 0 при первом вызове функции, если в dout есть две буквы «F», то в конце цикла for fout = 2. Я рассчитываю использовать fout = 2 в качестве начального значения при втором вызове функции и суммировать все буквы «F», которые я получил в общей сложности из всех раундов в игре.

Ответ №1:

Измените свои назначения 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))>=6amp;btt>0)
  {
    return(FALSE)
  }else if(fout (13-length(dleft))>=6amp;amp;btt>0amp;amp;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) .

Комментарии:

1. существуют ли какие-либо другие методы без использования глобальных переменных? Мне нужно запускать несколько функций одновременно, это приведет к чему-то неправильному, если все функции используют одинаковую глобальную переменную

2. Да, подходит ли вам мое объяснение альтернативного метода?

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

4. @XingqiFei Если мой ответ дал ответ на ваш вопрос, подумайте о принятии ответа, отметьте галочкой слева вверху. Если я этого не сделал, пожалуйста, дайте мне знать, как это можно улучшить.

5. В этом случае вы можете использовать porder аргумент для изменения имени каждой fout переменной? Может быть проще, но медленнее, просто записать файл, как я подробно описал в Alt методе 2? и вместо player.name , использовать porder?