2017-06-23 8 views
6

pmin निम्न उदाहरण में उपयुक्त आउटपुट वापस नहीं करता है।पिन गलत जवाब देता है

eps <- 1e-16 
x <- structure(list(X = c(0.219801587301587, 0.340792857142857, 0.398129365079365, 
         1, 1, 0.853353968253968, 0.930726984126984, 0.980263131313131, 
         0.968269047619047, 0.953053336369513, 1, 1, 1, 0.951969003219003, 
         0.91514335177894, 0.884824997224998, 0.884824997224998, 0.884824997224998)), row.names = c(NA, 18L), class = "data.frame", .Names = "X") 

pmin(x, 1 - eps) 

समारोह गलत तरीके से NA रिटर्न जहां x का मान 1 यह एक बग के रूप में सूचित किया जाना चाहिए है?

+0

यह एक अजीब परिणाम की तरह लगता है और मैं पुष्टि करता हूं कि मुझे वही चीज़ मिलती है। कुछ 'pmin (data.frame (a = 1: 3, b = 3: 5), 1)' मुझे थोड़ा समझ में आता है, खासकर जब 'pmin (data.frame (a = 1: 3, b = 3: 5), 1: 3) 'त्रुटियां। आदर्श प्रतीत नहीं होता है। – thelatemail

+0

चलिए इसे वास्तव में तोड़ते हैं - 'पमिन (डेटा.फ्रेम (ए = 1: 3, बी = 3: 5), डेटा.फ्रेम (ए = सी (1,1,1))) ' – thelatemail

+0

संकेत: आप देख रहे हैं 'do.call' के लिए। –

उत्तर

5

इसलिए मुझे पता चला कि ऐसा इसलिए है क्योंकि xdata.frame है और पिन एक वेक्टर की अपेक्षा कर रहा है। तो निम्न कार्य ठीक:

pmin(x[,1], 1 - eps) 

लेकिन मैं समझने के लिए क्यों यह data.frame के लिए काम नहीं कर रहा था चाहता था। तो निम्नलिखित pmin हमलावर लाइन के लिए कोड से गुजर रहा है:

mmm[change] <- each[change] 

क्योंकि each (इस मामले में 1 - eps) स्थिर करने के लिए संदर्भित करता है और change एक तार्किक वेक्टर each[1] के अलावा और कुछ NA वापस आ जाएगी है। जबकि इस मामले में जहां x एक वेक्टर है पर समारोह की शुरुआत में कार्यान्वित:

if (all(vapply(elts, function(x) is.atomic(x) && !is.object(x), NA))) { 
     mmm <- .Internal(pmin(na.rm, ...)) 
     mostattributes(mmm) <- attributes(elts[[1L]]) 
    } 

कोड ऐसा लगता है का वह भाग के लिए जब pmin के लिए मान वैक्टर हैं इरादा है और उत्तरार्द्ध मामले का ख्याल रखता है जहां आपके पास data.frame हो सकता है, लेकिन यह इस परिदृश्य में विफल रहता है।

+0

यह सिर्फ एक पंक्ति से थोड़ा गहरा है। 'प्रत्येक'' mmm' की लंबाई तक दोहराया जाता है: 'प्रत्येक <- rep (प्रत्येक, length.out = l2)' जहां 'l2 = लंबाई (मिमीएम)' (जब 'mmm' डेटा फ्रेम है, यह है कॉलम की संख्या)। और 'प्रत्येक' एक 'सूची' है, न कि मूल्य। – Gregor

+1

यह भी मुश्किल है कि 'pmin' को समरूप रूप से काम करने के लिए डिज़ाइन किया गया है,' pmin (x, y) 'और' pmin (y, x) 'एक ही परिणाम लौटा रहा है। मुझे लगता है कि यह कहना उचित है कि डेटा फ्रेम पर इसका उपयोग कभी नहीं किया गया था - हालांकि भ्रमित परिणाम के बजाय त्रुटि को फेंकना शायद बेहतर होगा। – Gregor

+0

@ ग्रेगोर - यह मेरा विचार होगा। यदि यह दो (या n) वैक्टर नहीं है, या दो (या n) डेटा हैं। सटीक समान आयामों के फ्रेम/मैट्रिस, तो इसे एक त्रुटि फेंकनी चाहिए। – thelatemail

संबंधित मुद्दे