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

R file.mtime() чрезвычайно низкая точность в Mac OS и Windows 7

В Windows 7 и Mac OS 10.12.2 (с R 3.3.2) появляется, что file.mtime() сильно округляет или обрезает временные метки. Я подтвердил, что file.create("my_file.txt"); print(as.numeric(file.mtime("my_file.txt")), digits = 22) выводит несколько цифр после десятичной дробной части в Linux, но все, что прошло после десятичной дроби, исчезает в Windows 7 для одного и того же my_file.txt. Поведение для Mac OS 10.12.2 аналогично поведению Windows 7. Существует ли независимый от платформы способ получения точных временных меток файла в R?

4b9b3361

Ответ 1

Я думаю, что новый file.info, вероятно, лучший способ. Если R-3.3.3 не приносит то, что вам нужно (или в промежуточный период, если оно будет), вы можете попытаться выполнить его шаг за шагом, используя тот факт, что stat, вероятно, установлен в базовой ОС (у меня есть не тестировался на Mac):

as.POSIXct(system2("stat", args = c("-c", "%y", "my_file.txt"), stdout = TRUE))
# [1] "2017-02-15 11:24:13 PST"

Это может быть формализовано в функции, которая больше для вас делает skosh:

my_mtime <- function(filenames, stat = c("modified", "birth", "access", "status"),
                     exe = Sys.which("stat")) {
  if (! nzchar(exe)) stop("'stat' not found")
  stat <- switch(match.arg(stat), birth = "%w", access = "%x", modified = "%y", status = "%z")
  filenames <- Sys.glob(filenames) # expand wildcards, remove missing files
  if (length(filenames)) {
    outs <- setNames(system2(exe, args = c("-c", stat, shQuote(filenames)), stdout = TRUE),
                     nm = filenames)
    as.POSIXct(outs)
  }
}

my_mtime("[bh]*")
#                  b-file.R                  h-file.R 
# "2017-02-14 05:46:34 PST" "2017-02-14 05:46:34 PST"

Поскольку вы запросили file.mtime, я предполагаю, что "измененный" вам наиболее интересен, но достаточно легко включить некоторые другие временные метки файла:

my_mtime("[bh]*", stat="birth")
#                  b-file.R                  h-file.R 
# "2017-02-13 22:04:01 PST" "2017-02-13 22:04:01 PST" 
my_mtime("[bh]*", stat="status")
#                  b-file.R                  h-file.R 
# "2017-02-14 05:46:34 PST" "2017-02-14 05:46:34 PST" 

Обратите внимание, что отсутствие дробных секунд является артефактом печати (как вы сказали), это можно исправить:

x <- my_mtime("[bh]*", stat="status")
x
#                  b-file.R                  h-file.R 
# "2017-02-14 05:46:34 PST" "2017-02-14 05:46:34 PST" 
options(digits.secs = 6)
x
#                         b-file.R                         h-file.R 
# "2017-02-14 05:46:34.307046 PST" "2017-02-14 05:46:34.313038 PST" 
class(x)
# [1] "POSIXct" "POSIXt" 

Обновление: после тестирования на Mac я подтвердил пару вещей (благодаря @HongOoi для prod): (1) stat действительно отличается, не поддерживая ту же команду, line, поэтому этот script должен быть обновлен; и (2) этот ответ предполагает, что файловая система даже не сохраняет подсезонное разрешение на время файла. Если ваш тип файловой системы - HFS +, я думаю, здесь нечего делать. Если базовая файловая система отличается, у вас могут быть лучшие результаты.

Это правда, что Windows не поставляется с исполняемым файлом stat. Однако Git для Windows (что некоторые утверждают, что это необходимо в аналитике /dev toolkit), в /Program Files/Git/usr/bin/stat.exe. (На самом деле мой взлом выше был написан на Windows, второй проверен на Ubuntu.)

В итоге, к сожалению, вы не можете получить то, что хотите/нуждаетесь в MacOS, в зависимости от типа вашей файловой системы. Я не смог установить установленный stat, чтобы дать подсевое разрешение (даже с его разными аргументами), предполагая, что ответ на 4 года, на который я ссылался, не изменился.

Ответ 2

Вы можете подождать около 2 недель, после чего R 3.3.3 решит эту проблему (по крайней мере для Windows). Из файла NEWS:

(только для Windows). file.info() теперь возвращает отметки времени файла, включая доли секунд; он сделал это на других платформах с R 2.14.0. (NB: некоторые файловые системы не записывают изменения и временные метки доступа к второму разрешению.)