परीक्षण में मैं ने कहा है कि यह समस्या अभी भी 32 बिट आर 3.01 के लिए मौजूद है और यह चल बिन्दु डेटा का एक काट-छांट के 32 बिट कार्यान्वयन के लिए विशिष्ट है की वजह से है कि: आप format
सीधे फोन करके यह देख सकते POSIXlt दिनांक समय के लिए प्रिंट, प्रारूप और as.character ऑपरेटरों।
अंतर्निहित डेटा को एक अलग प्रकार में संग्रहीत नहीं किया गया है जो एक मामले (32 बिट) में छंटनी की ओर अग्रसर है और अन्य (64 बिट) नहीं, बल्कि "प्रिंट", "प्रारूप" और "as.character "POSIXlt प्रकार के लिए फ़ंक्शंस विशेष रूप से जो POSIXlt डेटा को प्रदर्शित करने योग्य स्ट्रिंग के रूप में प्रदर्शित करने के लिए उपयोग किया जाता है।
जबकि दस्तावेजी व्यवहार यह है कि ये फ़ंक्शंस अतिरिक्त अंकों को छेड़छाड़ (अनदेखा) करते हैं (जैसा कि @Gavin सिम्पसन द्वारा उल्लिखित है), यह 32 और 64 बिट संस्करणों के लिए भी सही नहीं है। प्रदर्शित करना; हम 1000 विभिन्न बार पैदा करते हैं और कुछ तुलना कार्रवाई होगी: के तहत दोनों 32 बिट और 64 बिट तुलना ऑपरेटरों संगत कर रहे हैं, तथापि के तहत 32 बिट मैं देख रहा हूँ
> options(digits.sec=3)
> x = as.POSIXlt("13:29:56.061", format='%H:%M:%OS', tz='UTC')
> for (i in 0:999) {
> x[i+1] = as.POSIXlt(paste0("13:29:56.",sprintf("%03d",i)),format='%H:%M:%OS',tz='UTC')
> }
> sum(x[2:1000]>x[1:999])
[1] 999
:
> x[1:6]
[1] "2015-10-16 13:29:56.000 UTC" "2015-10-16 13:29:56.000 UTC"
[3] "2015-10-16 13:29:56.002 UTC" "2015-10-16 13:29:56.003 UTC"
[5] "2015-10-16 13:29:56.003 UTC" "2015-10-16 13:29:56.005 UTC"
तो यह है स्पष्ट रूप से एक प्रदर्शन मुद्दा। , POSIXlt डेटाप्रकार में वास्तविक संख्या को देखते हुए विशेष रूप से सेकंड हम देख सकते हैं कि क्या होने प्रकट होता है:
> y = (x[1:6]$sec)
> y
[1] 56.000 56.001 56.002 56.003 56.004 56.005
> trunc(y*1000)/1000
[1] 56.000 56.001 56.002 56.003 56.004 56.005
> trunc((y-floor(y))*1000)/1000
[1] 0.000 0.000 0.002 0.003 0.003 0.005
मेरा सुझाव है कि यह एक बग है कि अंतर्निहित आधार पुस्तकालय में तय किया जाना चाहिए, एक अस्थायी ठीक के रूप में हालांकि, आप आउटपुट को अपने वांछित आउटपुट में बदलने के लिए "प्रिंट", "as.character" और "format" फ़ंक्शंस को ओवरराइट कर सकते हैं।
format.POSIXlt = function(posix) {
return(paste0(posix$year+1900,"-",sprintf("%02d",posix$mon+1),"-",sprintf("%02d",posix$mday)," ",
sprintf("%02d",posix$hour),":",sprintf("%02d",posix$min),":",sprintf("%002.003f",posix$sec)))
}
print.POSIXlt = function(posix) {
print(paste0(posix$year+1900,"-",sprintf("%02d",posix$mon+1),"-",sprintf("%02d",posix$mday)," ",
sprintf("%02d",posix$hour),":",sprintf("%02d",posix$min),":",sprintf("%002.003f",posix$sec)))
}
as.character.POSIXlt = function(posix) {
return(paste0(posix$year+1900,"-",sprintf("%02d",posix$mon+1),"-",sprintf("%02d",posix$mday)," ",
sprintf("%02d",posix$hour),":",sprintf("%02d",posix$min),":",sprintf("%002.003f",posix$sec)))
}
प्रारूप() का उपयोग अनावश्यक और विचलित है। । । – mdsumner
ठीक है हाँ, लेकिन हमें 'प्रारूप ='% एच:% एम:% ओएस 'की आवश्यकता है। –
यह भी देखें http://stackoverflow.com/a/7730759/210673 – Aaron