2016-09-28 6 views
5

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

मेरे पास हेक्सागोनल ग्रिड है, और मैं सेल की संख्या की गणना कर रहा हूं, यह मेरे बाएं कोने में शुरू होने वाले बाएं निचले कोने में शुरू होने वाले उदाहरण में 1 से 225 तक है। तो सेल 16 है रखा थोड़ा सही सेल 1. देखने स्नैपशॉट ऊपर ऑफसेट: example of grid I'm working with

वजह, अगर मैं वाई समन्वय है, एक्स समन्वय या तो गोल, या छत हो गया है। अपने आवेदन में उपयोगकर्ता कोशिकाओं बताते हैं, मैं इस बचाने के लिए और पाश के लिए एक के रूप में Xcells के लिए खिलौना इनपुट मूल्यों के साथ, इस प्रकार और Ycells उपयोगकर्ता चुना है | कोशिकाओं वह चुना है निर्धारित करने के लिए कोशिकाओं के माध्यम से जाना:

gridsize <- 15 

Xcells <-c(0.8066765, 1.8209879, 3.0526517, 0.5893240) 
Ycells <-c(0.4577802, 0.4577802, 0.5302311, 1.5445425) 

clicks <- length(Xcells) 
cells <-vector('list', clicks) 

यह सेल 1 2 3 और 16. 4 क्लिक से मेल खाता है। अब सेल नंबर निर्धारित करने के लिए:

Y <- ceiling(Ycells) 
     for(i in 1:clicks){ 
     if(Y[i]%%2==1){ 
      X[i] <- round(Xcells[i]) 
     } 
     else{ 
     X[i]<- ceiling(Xcells[i]) 
     } 

     #determine the cell numbers and store in predefined list 
     cells[[i]] <- (Y[i]-1)*gridsize + X[i] 
     } 

तो अगर Y है 'भी' एक्स गोल हो गया है, और अगर Y है 'अन-यहां तक ​​कि' यह छत मूल्य हो गया है।

क्या वेक्टरेशन का उपयोग करके लूप के बिना ऐसा करने का कोई तरीका है? एक अन्य विकल्प


(-

+0

आपने 'X' किसी भी को परिभाषित नहीं किया है यहाँ। इसके अलावा, अच्छे प्रश्न के लिए कुडोस और एक द्विपक्षीय समाधान मांगने के लिए नहीं बल्कि समस्या को संबोधित करने के लिए- इन दिनों एसओ पर एक लाख में ... –

+0

मुझे लगता है कि यह संदर्भ मदद कर सकता है: http: //www.redblobgames। कॉम/ग्रिड/हेक्सागोन/ – baptiste

+0

@ डेविड एडनबर्ग, क्या यह आवश्यक है? निश्चित नहीं है कि मुझे इसे इस तरह से कहने की अनुमति है, लेकिन एक्स एक्स को अपने आप को 'एक्स [i] <- round (..) ' – Piet93

उत्तर

2

आप इस रूप में

(Y - 1) * gridsize + ifelse(Y %% 2 == 1, round(Xcells), ceiling(Xcells)) 
# [1] 1 2 3 16 

इस प्रकार vectorize सकते हैं (आप की कोशिश कर सकते मैं पूर्व की गणना round(Xcells) और ceiling(Xcells) इस में थोड़ा और अधिक सुधार होगा यकीन नहीं है) यदि आप ifelse से बचना चाहते हैं)

(Y - 1) * gridsize + cbind(ceiling(Xcells), round(Xcells))[cbind(1:length(Xcells), Y %% 2 + 1)] 
# [1] 1 2 3 16 
+0

मुझे वास्तव में 'ifelse' पसंद है, यह वास्तव में साफ दिखता है और आप देख सकते हैं कि कोड की इस पंक्ति को बहुत आसानी से करना है (कम अनुभवी कोडर के लिए मुझे लगता है कि यह एक फायदा है)। धन्यवाद। – Piet93

+1

'ifelse' वास्तव में साफ है लेकिन इसमें [कुछ मुद्दे] हैं (http://stackoverflow.com/questions/16275149/does-ifelse-really-calculate-both-of-its-vectors- हर- टाइम-is-it -slow)। जब भी मैं कर सकता हूं मैं इसे टालने की कोशिश कर रहा हूं –

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