Есть ли способ получить время, когда объект был создан?
Временная метка создания объекта
Ответ 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