Подтвердить что ты не робот

Временная метка создания объекта

Есть ли способ получить время, когда объект был создан?

4b9b3361

Ответ 1

Как правило, вы можете сделать это для объектов, созданных вами через

R> df <- data.frame(a=sample(LETTERS[1:5],10,TRUE),b=runif(10))
R> attr(df, "createdAt") <- Sys.time()
R> df
   a         b
1  B 0.8437021
2  D 0.8683446
3  B 0.5194791
4  B 0.0480405
5  B 0.5604978
6  C 0.1938154
7  A 0.1451077
8  D 0.1785405
9  C 0.3937795
10 B 0.2874135
R> str(df)
'data.frame':   10 obs. of  2 variables:
 $ a: Factor w/ 4 levels "A","B","C","D": 2 4 2 2 2 3 1 4 3 2
 $ b: num  0.844 0.868 0.519 0.048 0.56 ...
 - attr(*, "createdAt")= POSIXct, format: "2011-03-16 10:42:10.137434"
R> 

и затем вы можете написать собственные пользовательские функции print() или show(), которые используют атрибут. Фрэнк Харрелл rms, и его предшественник проекта сделал что-то подобное в течение длительного времени.

Ответ 2

Короткий ответ: No.

Длинный ответ: Да, все, что вам нужно сделать, это переписать код назначения в ядре R C, чтобы хранить datestamp где-то каждый раз, когда объект был изменен. Я попробовал это один раз, сохранив данные в атрибуте, как и другие ответы здесь, но у него был неудачный побочный эффект создания одинаковых объектов. x = 1 и y = 1 имели разные временные метки, поэтому идентичные (x, y) были FALSE и великолепно разрывали R-тесты. Я сдался.

Ответ 3

В дополнение к ответу Spacedman и моему комментарию в этом примере:

x <- 1
print(x)
# [1] 1

`<-` = function(...) {
  eval.parent(replace(match.call(), c(1, 3), list(base::`<-`, structure(..2, ctime=Sys.time()))))
}

x <- 2
print(x)
# [1] 2
# attr(,"ctime")
# [1] "2011-03-17 11:33:55 EDT"

Вероятно, вы не захотите делать это в .GlobalEnv, но это может быть полезно в локализованной среде.

Ответ 4

Я думаю, что функция Чарльза велика, но она может создавать проблемы в глобальной среде.

Я предлагаю создать новый оператор %c% для использования вместо <-:

`%c%` = function(...) {
  eval.parent(replace(match.call(), c(1, 3), list(base::`<-`, structure(..2, ctime=Sys.time()))))
}
## object 1 older than object 2?
`%c<%` = function(x1, x2) {
  if (any(names(attributes(x1))=="ctime") && any(names(attributes(x2))=="ctime")) {
    attr(x1, "ctime") < attr(x2, "ctime")
  } else {
    NA
  }
}
## object 1 newer than object 2?
`%c>%` = function(x1, x2) {
  if (any(names(attributes(x1))=="ctime") && any(names(attributes(x2))=="ctime")) {
    attr(x1, "ctime") > attr(x2, "ctime")
  } else {
    NA
  }
}

Другие две функции могут использоваться для сравнения временных меток. (С помощью этих последних функций я могу избежать трудоемких вычислений, если некоторые объекты аргументов не изменились.)

> xx %c% 1
> xx
[1] 1
attr(,"ctime")
[1] "2017-09-14 17:01:03 EEST"
> xx + 1
[1] 2
attr(,"ctime")
[1] "2017-09-14 17:01:03 EEST"
> class(xx)
[1] "numeric"
> yy %c% 2
> xx+yy
[1] 3
attr(,"ctime")
[1] "2017-09-14 17:01:03 EEST"
> yy
[1] 2
attr(,"ctime")
[1] "2017-09-14 17:04:27 EEST"
> xx %c<% yy
[1] TRUE
> xx %c>% yy
[1] FALSE