Как мы можем построить таймер для 5 разных игроков, используя замыкание в R - PullRequest
1 голос
/ 09 ноября 2019

Есть 4 отдельные функции для начала, окончания, получения их продолжительности и отображения их результатов в порядке убывания, которые должны быть реализованы с использованием замыкания. Сначала я пытался реализовать три функции: -

StopWatch <- function(){
 list(strt<-function(Name = "name") Start <<- Sys.time(),
      stop<-function() End <<- Sys.time(),
      duration<-function(){ t <<- Start- End
      print(t)})
}
w<- StopWatch()
w$strt("player1")
sleep_for_a_minute()
w$stop()
w$duration()

Когда я запускаю w $ strt ("player1"), выдается ошибка: попытка применить не-функцию

Ответы [ 2 ]

2 голосов
/ 09 ноября 2019

Поскольку @ Тайлер Смит уже написал , вам нужно =, потому что вы хотите присвоить имена элементам list здесь, а не определять функции. Также вы пытаетесь переписать функцию t() (которая, например, приводит к ошибке), используйте что-то другое.

StopWatch <- function() {
  list(strt=function(Name = "name") Start <<- Sys.time(),
       stop=function() End <<- Sys.time(),
       duration=function() { 
         tm <<- Start - End
         print(tm)
       })
}

w <- StopWatch()
w$strt("player1")
Sys.sleep(1)  
w$stop()
w$duration()
# Time difference of -2.27513 secs
2 голосов
/ 09 ноября 2019

Список, который вы создаете в своей функции, не назван. Проверьте, запустив names(w). Вы должны использовать = вместо <-

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