2017-02-09 27 views
17

पर विंडोज 7 और मैक ओएस 10.12.2 (आर 3.3.2 के साथ) पर बेहद खराब परिशुद्धता, ऐसा लगता है कि file.mtime() गंभीर रूप से राउंड या टाइमस्टैम्प को छोटा करता है। मैंने सत्यापित किया कि file.create("my_file.txt"); print(as.numeric(file.mtime("my_file.txt")), digits = 22) लिनक्स पर दशमलव से पिछले कई अंकों को प्रिंट करता है, लेकिन दशमलव के पीछे सब कुछ उसी ही my_file.txt के लिए विंडोज 7 पर गायब हो जाता है। मैक ओएस 10.12.2 के लिए व्यवहार विंडोज 7 के समान है। आर में सटीक फ़ाइल टाइमस्टैम्प प्राप्त करने के लिए कोई प्लेटफ़ॉर्म-स्वतंत्र तरीका है?आर file.mtime() मैक ओएस और विंडोज 7

उत्तर

3

मुझे लगता है कि नए file.info संभावना जाने के लिए सबसे अच्छा तरीका है। यदि आर-3.3.3 आपको जो चाहिए (या अंतरिम में, यदि यह होगा) नहीं लाता है, तो आप इस आधार पर पूंजीकरण करके इसे साइड-स्टेप करने का प्रयास कर सकते हैं कि stat बेस ओएस में स्थापित हो सकता है (मैंने परीक्षण नहीं किया है Mac पर):

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 के लिए कहा, मैं यह सोचते हैं रहा हूँ "संशोधित" सबसे है:

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

यह एक समारोह है कि आप के लिए एक skosh अधिक करता में औपचारिक रूप दिया जा सकता है आपके लिए दिलचस्प है, लेकिन कुछ अन्य फ़ाइल टाइमस्टैम्प को शामिल करना काफी आसान है:

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 पर परीक्षण के बाद, मैं चीजों की एक जोड़ी की पुष्टि की (प्रोड के लिए @ हांगोई के लिए धन्यवाद): (1) stat वास्तव में अलग है, समान कमांड लाइन विकल्पों का समर्थन नहीं करता है, इसलिए इस स्क्रिप्ट को अपडेट करने की आवश्यकता होगी; और (2) this answer बताता है कि फाइल सिस्टम फ़ाइल समय पर उप-दूसरे संकल्प को भी संग्रहीत नहीं कर रहा है। यदि आपका फाइल सिस्टम प्रकार एचएफएस + है, तो मुझे लगता है कि यहां कुछ भी नहीं किया जा सकता है। यदि अंतर्निहित फाइल सिस्टम अलग है, तो आपके पास बेहतर परिणाम हो सकते हैं।

यह सच है कि विंडोज stat निष्पादन योग्य नहीं है। हालांकि, Git for Windows (जो कुछ तर्क एक विश्लेषक/देव टूलकिट में एक आवश्यकता है) /Program Files/Git/usr/bin/stat.exe के तहत करता है। (वास्तव में, उपरोक्त मेरा हैक विंडोज पर लिखा गया था, उबंटू पर दूसरा परीक्षण किया गया था।)

नीचे की रेखा, दुर्भाग्य से, आप अपने फाइल सिस्टम प्रकार के आधार पर मैकोज़ पर जो चाहते हैं उसे प्राप्त नहीं कर सकते हैं। उप-दूसरे रिज़ॉल्यूशन (यहां तक ​​कि इसके विभिन्न तर्कों के साथ) देने के लिए मुझे stat इंस्टॉल नहीं किया जा सका, यह बताते हुए कि 4 साल का पुराना उत्तर मैंने संदर्भित नहीं किया है।

+0

स्टेट एक यूनिक्स/लिनक्स उपयोगिता है, जो विंडोज़ पर मौजूद नहीं है। मैक पर, फाइल सिस्टम स्वयं केवल 1-सेकंड रिज़ॉल्यूशन के साथ स्टोर करता है (जब तक एपीएफएस नहीं आता है)। यह मूल रूप से आर के 'file.info' से पहले कुछ भी नहीं करता है। –

+0

ध्यान दें कि विजुअल स्टूडियो में गिट एकीकरण के साथ आता है, इसलिए आपको जरूरी स्टैंडअलोन गिट इंस्टॉल की भी आवश्यकता नहीं है। –

+0

मुझे यह नहीं पता था, धन्यवाद। क्या वीएस अन्य यूनिक्स-वाई निष्पादन योग्य 'स्टेट' जैसी आती है? (वीएस को जांचने के लिए नहीं सोचा था क्योंकि यह सवाल में नहीं था, शायद ओपी इसका उपयोग कर सकता है।) – r2evans

6

आप लगभग 2 सप्ताह तक प्रतीक्षा कर सकते हैं, जिस बिंदु पर आर 3.3.3 इस समस्या को हल करेगा (कम से कम विंडोज के लिए)। NEWS फ़ाइल से:

(केवल विंडोज़) file.info() अब सेकेंड के अंश सहित फ़ाइल टाइमस्टैम्प देता है; यह आर 2.14.0 के बाद से अन्य प्लेटफार्मों पर ऐसा किया है। (ध्यान दें: कुछ फ़ाइल सिस्टम उप दूसरा समाधान करने के लिए संशोधन और पहुँच timestamps रिकॉर्ड नहीं है।)

+0

साफ! विंडोज के लिए यह बहुत अच्छा है। मैं शायद [मैक ओएस] के लिए भाग्य से बाहर हूं (http://stackoverflow.com/questions/18403588/how-to-return-millisecond-Information-for-file-access-on-mac-os-x-in -जावा), यद्यपि। – landau