(यह जवाब नहीं अन्य जोड़ता है:
identical(a, !!--a)
[1] TRUE
एक वैकल्पिक, और शायद स्पष्ट, दृष्टिकोण सीधे a
की storage.mode
बदलने के लिए है पहले से मौजूद लोगों के लिए विकल्प, लेकिन मैं सिर्फ इस थ्रेड में टिप्पणियों को साफ करने के लिए पोस्ट कर रहा हूं।)
as.integer
, परिभाषा द्वारा, as.vector
की तरह बर्ताव करता है, यानी यह सभी विशेषताओं स्ट्रिप्स ("मंद" शामिल है) एक अनुसंधान वेक्टर बनाने के लिए। यह एक ही ऑब्जेक्ट को बदले typeof
के साथ वापस नहीं करेगा। जबरदस्ती के बाद गुणों को बहाल करने के लिए, "dim<-"
, "names<-"
, "class<-"
इत्यादि स्पष्ट रूप से या किसी फ़ंक्शन के माध्यम से कहा जाना चाहिए जो इसके तर्कों के गुणों को संग्रहीत करता है (उदा। "[<-"
)। जैसे "dim<-"(as.integer(a), dim(a))
या array(as.integer(a), dim(a))
या a[] <- as.integer(a)
। एक बेंचमार्क:
x = matrix(T, 1e3, 1e3)
microbenchmark::microbenchmark("dim<-"(as.integer(x), dim(x)),
array(as.integer(x), dim(x)),
{ x[] = as.integer(x) }, times = 25)
#Unit: milliseconds
# expr min lq median uq max neval
# `dim<-`(as.integer(x), dim(x)) 1.650232 1.691296 2.492748 4.237985 5.67872 25
# array(as.integer(x), dim(x)) 6.226130 6.638513 8.526779 8.973268 47.50351 25
# { x[] = as.integer(x) } 7.822421 8.071243 9.658487 10.408435 11.90798 25
ऊपर में, "dim<-"
justs बनाया as.integer(x)
को एक विशेषता, array
बनाया as.integer(x)
स्टोर करने के लिए एक नया वेक्टर, और "[<-"
परिवर्तन "x" इतना है कि यह स्वीकार कर सकते हैं के मूल्यों आवंटित कहते हैं as.integer(x)
बनाया और फिर, अपने नए मान डालने के लिए "x" के माध्यम से पुनरावृत्त करता है।
x = as.character(1:5)
x
#[1] "1" "2" "3" "4" "5"
x[] = as.integer(x)
x
#[1] "1" "2" "3" "4" "5"
या::
x = 1:5
x
#[1] 1 2 3 4 5
x[] = as.logical(x)
x
#[1] 1 1 1 1 1
लेकिन:
x = round(runif(5), 2)
x
#[1] 0.68 0.54 0.02 0.14 0.08
x[] = as.character(x)
x
#[1] "0.68" "0.54" "0.02" "0.14" "0.08"
यानी
"[<-"
विधि है, हालांकि, एक नुकसान है प्रतिस्थापन ऑब्जेक्ट के typeof
typeof
प्रतिस्थापन योग्य ऑब्जेक्ट के "[<-"
typeof
को नहीं बदलेगा। Subassignment (अर्थात "[<-"
) coerces या तो वस्तु को बदल देना चाहिए या की जगह वस्तु या कोई भी उनके typeof
रों पर निर्भर करता है (इस SubassignTypeFix
द्वारा किया जाता है)। @ जोश ओ'ब्रायन "[<-"
के व्यवहार में मौजूद होने की संभावना को नोट करते हैं यदि सूचकांक गुम हैं। ईमानदार होने के लिए, मुझे इस तरह के मामले में एक विशिष्ट उपचार नहीं मिला, उदाहरण के लिए, उदाहरण के लिए do_subset_dflt
("["
) अप्रत्यक्ष रूप से लापताता को संभालता है।
जैसा कि पहले ही उल्लेख किया है, वहाँ है, भी, "storage.mode<-"
एक वस्तु का typeof
बदलने के लिए:
"storage.mode<-"(as.character(1:5), "integer")
#[1] 1 2 3 4 5
"storage.mode<-"(1:5, "logical")
#[1] TRUE TRUE TRUE TRUE TRUE
"storage.mode<-"(round(runif(5), 2), "character")
#[1] "0.09" "0.38" "0.98" "0.73" "0.81"
x = matrix(T, 1e3, 1e3)
microbenchmark::microbenchmark("storage.mode<-"(x, "integer"),
"dim<-"(as.integer(x), dim(x)), times = 25)
#Unit: milliseconds
# expr min lq median uq max neval
# `storage.mode<-`(x, "integer") 1.986055 2.01842 2.147181 2.406096 6.019415 25
# `dim<-`(as.integer(x), dim(x)) 1.984664 2.02016 2.111684 2.613854 6.174973 25
"dim<-"
को दक्षता में इसी प्रकार के बाद से वे दोनों एक बार विवश और एक विशेषता की दुकान।
बाइनरी ऑपरेशंस (जैसा कि जेम्स और कोनराड रुडॉल्फ द्वारा उल्लिखित) उनके तर्कों को उपयुक्त typeof
पर केंद्रित करते हैं और गुण ("मंद", "नाम", "वर्ग" इत्यादि रखते हैं।) दो तर्कों के नियमों के आधार पर। (धारा "मान" ?Arithmetic
में)
मूल आयामों प्राप्त करने के लिए ' 'मंद <-' (as.integer (क), मंद (क))'। यदि वहाँ 'तत्वों में से एक के रूप में Inf',' as.integer' यह 'NA' को, coerces जबकि' + 0L' 'देता है कि तत्व – akrun
या सिर्फ' एक [] <के लिए Inf' मूल्य - as.integer (क) '। हालांकि यह सवाल का जवाब नहीं देता है। –
या, 'storage.mode (ए) <- "पूर्णांक" ' – James