2010-06-28 10 views
16

R में वेक्टर इंडेक्स सामान्य 0 की बजाय 1 से शुरू होने का कारण क्या है?आर में वेक्टर इंडेक्स 1 के बजाय 1 के साथ क्यों शुरू होता है?

उदाहरण:

> arr<-c(10,20) 
> arr[0] 
numeric(0) 
> arr[1] 
[1] 10 
> arr[2] 
[1] 20 

यह है सिर्फ इतना है कि वे वेक्टर बारे में अतिरिक्त जानकारी स्टोर करने के लिए चाहते हैं और जहां वेक्टर का पहला तत्व के रूप में छोड़कर यह स्टोर करने के लिए पता नहीं था?

+23

"सामान्य '0' कुछ हद तक सापेक्ष है। सुबह में मेरा पहला कप कॉफी मेरा पहला है, न कि मेरा शून्य-वां। –

+7

लेकिन जब आप पैदा होते हैं तो आप शून्य वर्ष के होते हैं और अपने पहले जन्मदिन के लिए एक वर्ष का इंतजार करना पड़ता है। – Frank

+8

क्योंकि उम्र * पूरे वर्षों * में मापा जाता है। बस एक अलग सम्मेलन। मेरी उंगलियों को अभी भी 1 से 10 अंक दिया गया है। –

उत्तर

34

फ़ोरट्रान एक ऐसी भाषा है जो 1 पर सरणी शुरू करती है। गणितज्ञ वेक्टरों से निपटते हैं जो हमेशा घटक 1 से शुरू होते हैं और एन रैखिक बीजगणित सम्मेलनों के माध्यम से पंक्ति और स्तंभ संख्या 1 से शुरू होते हैं और एन के माध्यम से भी जाते हैं।

सी शून्य के साथ शुरू हुआ क्योंकि पॉइंटर अंकगणित के नीचे शून्य था। जावा, जावास्क्रिप्ट, सी ++, और सी # सी

+4

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

+5

@ सर्पी, क्या आप उस टिप्पणी को समझा सकते हैं? मुझे पॉइंटर्स के बारे में कुछ पता है लेकिन आप का पालन नहीं करते हैं। – gwg

+2

हालांकि पॉइंटर्स एकमात्र कारण नहीं हैं; पायथन भी शून्य से शुरू होता है लेकिन यह पॉइंटर्स के बजाए स्लाइसिंग के लालित्य पर आधारित था (लालित्य निश्चित रूप से व्यक्तिपरक है) - https://python-history.blogspot.nl/2013/10/why-python-uses-0- आधारित- indexing.html – Mark

0

से आप के बाद यह गलत कर रहे हैं। आप किसी ऑब्जेक्ट में अतिरिक्त विशेषताएं स्टोर करने के लिए चाहते हैं, attr का उपयोग करें:

> foo <- 1:20 
> attr(foo, "created") <- Sys.time()    # just as an example 
> str(foo) 
atomic [1:20] 1 2 3 4 5 6 7 8 9 10 ... 
- attr(*, "created")= POSIXct[1:1], format: "2010-06-28 14:07:15" # our time 
> summary(foo)          # object works as usual 
    Min. 1st Qu. Median Mean 3rd Qu. Max. 
    1.00 5.75 10.50 10.50 15.20 20.00 
> 
+2

मैं क्या गलत कर रहा हूँ? मैं अपनी वस्तु में कोई अतिरिक्त जानकारी स्टोर करने की कोशिश नहीं कर रहा था। – Frank

+5

मैंने आपके प्रश्न की अंतिम पंक्ति को गलत तरीके से पढ़ा। अपने प्रश्न का उत्तर देने के लिए: आर सी नहीं है। –

6

0 केवल "सामान्य" है, क्योंकि जो सी किया है कि, और बाद में भाषाओं का एक बहुत slavishly सी वाक्य रचना की नकल की। फोरट्रान सरणी में डिफ़ॉल्ट रूप से 1-आधारित होते हैं।

एडा में कोई डिफ़ॉल्ट नहीं है और आपको शुरुआत और अंत श्रेणी चुननी है। दिलचस्प बात यह है कि ऐसा लगता है कि अधिकांश कोड मैं निचले बाउंड के लिए '1' चुनता हूं। मुझे लगता है कि यह एक बहुत अच्छा संकेत है कि लोगों को मुफ्त विकल्प दिया गया था।

+1

स्लेविशली कॉपीिंग हिस्सा पूरी तरह से सच नहीं है, पाइथन जैसे अन्य लोकप्रिय भाषाओं ने जानबूझकर 0-आधारित चुना क्योंकि यह अधिक सुरुचिपूर्ण (निर्माता के अनुसार, कम से कम) का टुकड़ा बनाता है। डिजस्ट्रा यहां लेख के समान लालित्य तर्कों का पालन करता है https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html – Mark

15

गणित में वेक्टर अक्सर एन-टुपल्स के रूप में प्रदर्शित होते हैं, जिनमें से तत्व 1 से एन तक अनुक्रमित होते हैं। मुझे संदेह है कि आर इस नोटेशन के लिए सच रहना चाहता था।

3

आर "प्रयोग और अनुसंधान के लिए मंच" है। इसका उद्देश्य "statisticians to use the full capabilities of such an environment" को आमतौर पर आंकड़ों से निपटने के तरीके को पुनर्विचार किए बिना सक्षम करना है। तो लोग प्रतिगमन मॉडल बनाने के लिए सूत्रों का उपयोग करते हैं, और लोग 1.

8

फ्रैंक, मुझे लगता है कि जब आपने एआर टाइप किया था तो आपने जो देखा था उसे गलत व्याख्या कर रहे थे [0]। संख्यात्मक (0) का मतलब है कि नतीजा एक संख्यात्मक वेक्टर है जिसमें कोई तत्व नहीं है। इसका मतलब यह नहीं है कि वेक्टर के प्रकार को तत्व 0 में "संग्रहीत" किया जा रहा है। यदि आपने टाइप किया था, तो आपको वही परिणाम मिल गया होगा, उदाहरण के लिए, arr [arr> 30]। कोई तत्व उस स्थिति को पूरा नहीं करता है, इसलिए परिणाम वेक्टर में कोई तत्व नहीं है। इसी तरह, किसी भी तत्व में इंडेक्स 0 नहीं है। यह जानबूझकर है, और 0 स्पेस के साथ कुछ और करने के लिए इसका कोई लेना-देना नहीं है।

+0

मुझे लगता है कि [क्या Dirk व्याख्या करने का प्रयास करें] (http: // stackoverflow। कॉम/प्रश्न/3135325/क्यों-डू-वेक्टर-इंडेक्स-इन-आर-स्टार्ट-इन-1-बदले -0/3135372 # 3135372) लेकिन आपको पॉइंट मिला। +1 – Marek

2

असल में, मुझे लगता है कि सी जैसे संस्करण "0 के साथ शुरू करें" बहुत तार्किक है जब आप स्मृति व्यवस्थित तरीके से देखते हैं। सी में हम निम्नलिखित लिख सकते हैं:

int* T = new int[10]; 

सरणी के पहले तत्व है * टी। यह पूरी तरह से "तार्किक" है क्योंकि * टी पहली स्मृति मामले की ओर इशारा करता है। दूसरा तत्व दूसरा मामला है इसलिए * (टी + 1): हम एक "आकार (int)" से आगे बढ़ते हैं।

कोड को और अधिक पठनीय बनाने के लिए, सी ने उपनाम लागू किया: टी [i] के लिए * (टी + i)। पहले तत्व तक पहुंचने के लिए, आपको टी टी [0] तक पहुंचना होगा। यह पूरी तरह से प्राकृतिक है।

यह विचार iterators के लिए बढ़ा दी है:

std::vector<int> T(10); 
int val = *(T.begin()+3); 

टी [मैं] बस * (T.begin() + i) के लिए एक उपनाम है।

fortran/आर में, हम गणितीय समस्याओं के कारण 1 के साथ आमतौर पर शुरू लेकिन वहाँ निश्चित रूप से अन्य अच्छे विकल्प (उदाहरण के लिए सीएफ this link) है। यह मत भूलना कि किलेर आसानी से सरणी का उपयोग कर सकते हैं जो 0:

PROGRAM ZEROARRAY 
REAL T(0:9) 
T(0) = 3.14 
END 
संबंधित मुद्दे