التحويل بين الأنواع الرقمية
استخدم as.integer() وas.double() وas.numeric() بأمان.
التحويل بين الأنواع الرقمية درس مجاني في R Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
Integer مقابل Double في R
لدى R نوعان رقميان: integer (أعداد صحيحة، تُنشأ باستخدام اللاحقة L) وdouble (أعداد بفاصلة عائمة، وهو النوع الافتراضي للقيم العددية الحرفية). يستخدم R النوع double في معظم الحالات، لكن التمييز بينهما مهم لضمان سلامة النوع وكفاءة الذاكرة.
x_dbl <- 5 # double by default
x_int <- 5L # integer (L suffix)
cat('typeof(5): ', typeof(x_dbl), '
') # double
cat('typeof(5L): ', typeof(x_int), '
') # integer
cat('5 == 5L: ', x_dbl == x_int, '
') # TRUE (values equal)
cat('identical: ', identical(x_dbl, x_int), '
') # FALSE (types differ)as.integer() — التحويل إلى Integer
تحوّل as.integer(x) قيمةً إلى integer عن طريق الاقتطاع (لا التقريب) للجزء العشري. وهذا يعني أن 3.9 تصبح 3، لا 4. واللاحقة L هي صياغة مختصرة للقيم العددية الحرفية من نوع integer.
cat('as.integer(3.7): ', as.integer(3.7), '
') # 3 (truncated, not 4)
cat('as.integer(3.2): ', as.integer(3.2), '
') # 3
cat('as.integer(-2.9): ', as.integer(-2.9), '
') # -2 (toward zero)
cat('as.integer(10.9): ', as.integer(10.9), '
') # 10
# Compare with round
cat('round(3.7): ', round(3.7), '
') # 4as.double() وas.numeric()
تُعد as.double(x) وas.numeric(x) متكافئتين — فكلتاهما تحوّلان القيمة إلى double (عدد ذي فاصلة عائمة). استخدمهما لتحويل الأعداد الصحيحة إلى double عندما تحتاج إلى دقة كسرية.
count <- 7L # integer
cat('typeof(count): ', typeof(count), '
')
dbl_count <- as.double(count)
cat('typeof(as.double(7L)): ', typeof(dbl_count), '
') # double
cat('Value: ', dbl_count, '
') # 7
# Division automatically promotes to double
cat('7L / 2L: ', 7L / 2L, '
') # 3.5 (double)
cat('typeof(7L / 2L): ', typeof(7L / 2L), '
') # doubleالعمليات الحسابية على Integer
تنتج العمليات الحسابية على integer في R أعدادًا صحيحة عند استخدام + و- و*، لكنها تُرجع دائمًا double عند استخدام /. وقد يسبب ذلك مفاجأة إذا توقعت أن تظل القسمة الصحيحة من نوع integer.
a <- 6L
b <- 3L
cat('6L + 3L =', a + b, '| typeof:', typeof(a + b), '
') # 9 integer
cat('6L - 3L =', a - b, '| typeof:', typeof(a - b), '
') # 3 integer
cat('6L * 3L =', a * b, '| typeof:', typeof(a * b), '
') # 18 integer
cat('6L / 3L =', a / b, '| typeof:', typeof(a / b), '
') # 2 DOUBLE!
cat('6L %/% 3L =', a %/% b, '| typeof:', typeof(a %/% b), '
') # 2 integerالاقتطاع مقابل التقريب
هناك فرق مهم: تقوم as.integer() بالاقتطاع (حذف الكسور العشرية)، بينما تقوم round() بالتقريب إلى أقرب عدد صحيح. كن واضحًا دائمًا بشأن السلوك الذي تقصده.
values <- c(2.1, 2.5, 2.9, -2.1, -2.5, -2.9)
cat('Original: ', values, '
')
cat('as.integer(): ', as.integer(values), '
') # truncate toward 0
cat('round(): ', round(values), '
') # banker rounding
cat('floor(): ', floor(values), '
') # round down
cat('ceiling(): ', ceiling(values), '
') # round upخطر تجاوز سعة Integer
تستخدم أعداد integer في R تمثيلًا من 32 بت، ويمكنها تخزين قيم تصل تقريبًا إلى ±2.1 مليار. يؤدي تجاوز هذا النطاق إلى إنتاج NA مع ظهور تحذير. ويمكن لأعداد double تخزين قيم أكبر بكثير (حتى نحو 1.8 × 10^308).
max_int <- .Machine$integer.max
cat('Max integer:', max_int, '
') # 2147483647
# Overflow produces NA
cat('max_int + 1L:', max_int + 1L, '
') # NA with warning
# Double handles it fine
cat('as.double(max_int) + 1:', as.double(max_int) + 1, '
') # 2147483648اللاحقة L في المتجهات
يمكنك إنشاء متجهات من نوع integer باستخدام اللاحقة L مع كل عنصر، أو بتمرير تسلسل إلى as.integer(). وينتج عامل النقطتين : أعدادًا صحيحة تلقائيًا.
# Colon produces integers
seq_int <- 1:5
cat('1:5 typeof:', typeof(seq_int), '
') # integer
# Explicit integer vector
vec_int <- c(10L, 20L, 30L, 40L)
cat('c(10L,...) typeof:', typeof(vec_int), '
') # integer
# as.integer on a vector
vec_dbl <- c(1.1, 2.9, 3.5, 4.7)
cat('as.integer(c(1.1,...)):', as.integer(vec_dbl), '
') # 1 2 3 4الذاكرة والأداء
تستخدم الأعداد الصحيحة 4 بايت لكل عنصر، بينما تستخدم أعداد double 8 بايت. وبالنسبة إلى المتجهات الكبيرة جدًا من الأعداد الصحيحة، يمكن أن يؤدي استخدام integer إلى تقليل استهلاك الذاكرة إلى النصف. ومع ذلك، تحوّل العمليات الحسابية بين الأنواع المختلطة النوع تلقائيًا إلى double.
n <- 1000000L
vec_int <- 1:n # integer: 4 bytes each
vec_dbl <- as.double(1:n) # double: 8 bytes each
cat('Integer vector size:', object.size(vec_int), 'bytes
')
cat('Double vector size: ', object.size(vec_dbl), 'bytes
')
cat('Ratio:', as.numeric(object.size(vec_dbl)) / as.numeric(object.size(vec_int)), '
')التحقق من تخزين Integer باستخدام is.integer()
استخدم دائمًا is.integer() (وليس is.numeric()) عندما تحتاج تحديدًا إلى التحقق من تخزين integer. فالعدد الذي لا يحتوي على اللاحقة L يكون من نوع double حتى لو بدا عددًا صحيحًا.
a <- 5 # looks like integer, but it is double
b <- 5L # true integer
cat('is.integer(5): ', is.integer(a), '
') # FALSE!
cat('is.integer(5L): ', is.integer(b), '
') # TRUE
cat('is.numeric(5): ', is.numeric(a), '
') # TRUE
cat('is.numeric(5L): ', is.numeric(b), '
') # TRUE
cat('class(5): ', class(a), '
') # numeric
cat('class(5L): ', class(b), '
') # integerمثال على سير عمل التحويل
سير عمل عملي: اقرأ البيانات باستخدام double (وهو النوع الافتراضي)، ثم أجرِ الحسابات، وبعد ذلك حوّل النتائج صراحةً إلى integer حيثما تكون الأعداد الصحيحة مطلوبة (مثل الأعداد والفهارس والمعرّفات).
# Simulated: reading counts as doubles (common from CSV)
counts_raw <- c(12.0, 8.0, 15.0, 3.0, 22.0)
cat('typeof raw:', typeof(counts_raw), '
') # double
# Convert to integer for proper storage
counts_int <- as.integer(counts_raw)
cat('typeof converted:', typeof(counts_int), '
') # integer
cat('Counts:', counts_int, '
')
cat('Total:', sum(counts_int), '
')ملخص التحويلات الرقمية
دوال التحويل الأساسية للأنواع الرقمية:
as.integer(x)— الاقتطاع إلى integer (حذف الكسور العشرية باتجاه الصفر)as.double(x)/as.numeric(x)— التحويل إلى doubleround(x)— التقريب إلى الأقرب (استخدمه للقيم الشبيهة بالأعداد الصحيحة)floor(x)/ceiling(x)— التقريب إلى الأسفل / الأعلى- الصياغة
5L— قيمة عددية حرفية من نوع integer (لا تحتاج إلى تحويل) 1:n— تنتج دائمًا أعدادًا صحيحة
x <- 7.8
cat('as.integer(7.8):', as.integer(x), '
') # 7 (truncate)
cat('round(7.8): ', round(x), '
') # 8
cat('floor(7.8): ', floor(x), '
') # 7
cat('ceiling(7.8): ', ceiling(x), '
') # 8تحقق سريع
ما القيمة التي تُرجعها as.integer(3.9) في R؟
مراجعة: تحويل الأنواع الرقمية
ممتاز! إليك أهم النقاط المستخلصة من هذا الدرس:
- لدى R نوعان رقميان: integer (لاحقة L، ويستخدم 4 بايت) وdouble (الافتراضي، ويستخدم 8 بايت)
- تقوم
as.integer(x)بالاقتطاع باتجاه الصفر — ولا تقوم بالتقريب - تتطابق
as.double()وas.numeric()— فكلتاهما تحوّلان إلى double - تُرجع
/دائمًا قيمة double، حتى عند استخدام معاملات من نوع integer - تنشئ
1:nتسلسلات من نوع integer؛ أما القيم العددية الحرفية التي لا تحتوي على L فتكون من نوع double - يحدث تجاوز سعة integer عند نحو 2.1 مليار — لذا استخدم double للأعداد الصحيحة الكبيرة جدًا
# Demonstrate truncation vs rounding
test_vals <- c(0.1, 0.5, 0.9, 1.5, 2.5, 3.7)
cat('Values: ', test_vals, '
')
cat('as.integer(): ', as.integer(test_vals), '
') # truncation
cat('round(): ', round(test_vals), '
') # nearest (banker)الأسئلة الشائعة
هل درس «التحويل بين الأنواع الرقمية» مجاني؟
نعم — نص درس «التحويل بين الأنواع الرقمية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «التحويل بين الأنواع الرقمية»؟
استخدم as.integer() وas.double() وas.numeric() بأمان. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «التحويل بين الأنواع الرقمية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نظرة عامة على نظام الأنواع في R
- التحويل بين الأنواع الرقمية
- التحويل بين الأنواع المنطقية والنصية
- مزالق الإكراه وأفضل الممارسات