نتائج agrep () غير المتوقعة () المتعلقة بحصة Max.Distance في ص

StackOverflow https://stackoverflow.com/questions/1182932

  •  19-09-2019
  •  | 
  •  

سؤال

تعديل: تم العثور على هذا الخطأ في إصدارات 32 بت من R تم إصلاحه في الإصدار 2.9.2.


كان هذا هو تغريد لي بواسطة leoniedu اليوم وليس لدي إجابة له لذلك اعتقدت أنني سوف نشرها هنا.

لقد قرأت الوثائق الخاصة ب AGREP () (مطابقة سلسلة غامضة) ويبدو أنها لا أفهم تماما المعلمة Max.Distance. إليك مثال:

pattern <- "Staatssekretar im Bundeskanzleramt"
x <- "Bundeskanzleramt"
agrep(pattern,x,max.distance=18) 
agrep(pattern,x,max.distance=19)

هذا يتصرف بالضبط مثل كنت أتوقع. هناك 18 حرفا مختلفة بين السلاسل حتى أتوقع أن تكون عتبة المباراة. إليك ما يربكني:

agrep(pattern,x,max.distance=30) 
agrep(pattern,x,max.distance=31)
agrep(pattern,x,max.distance=32) 
agrep(pattern,x,max.distance=33)

لماذا 30 و 33 مباراة، ولكن ليس 31 و 32؟ لتوفير بعض العد،

> nchar("Staatssekretar im Bundeskanzleramt")
[1] 34
> nchar("Bundeskanzleramt")
[1] 16
هل كانت مفيدة؟

المحلول

لقد قمت بنشر هذا على قائمة R منذ الظهر وأبلغ عنها كحشرة في قائمة R-Bugs. لم يكن لدي أي ردود مفيدة، لذلك أخطرت لمعرفة ما إذا كان الخطأ مستاء أو كنت أفتقد شيئا فقط. تمكن JD منذ فترة طويلة من إعادة إنتاجها ونشرت على السؤال هنا.

لاحظ أنه، على الأقل في ص، إذن، Agrep هو سوء مذهل لأنه يفعل ليس يطابق التعبيرات العادية، في حين أن GREP لتقف على "البحث على المستوى العالمي عن التعبير العادي والطباعة". لا ينبغي أن يكون لها مشكلة في أنماط أطول من المتجه الهدف. (أظن!)

في خادم Linux الخاص بي، كل شيء على ما يرام ولكن ليس كذلك في أجهزة Mac و Windows.

Mac: SessionInfo () R الإصدار 2.9.1 (2009-06-26) I386-Apple-Darwin8.11.1 الإعداد: en_us.utf-8 / en_us.utf-8 / c / c / en_us.utf-8 / en_us. UTF-8.

agrep (نمط، x، max.distance = 30) [1] 1

agrep (النمط، x، max.distance = 31) عدد صحيح (0) Agrep (النمط، X، MAX.Distance = 32) عدد صحيح (0) Agrep (النمط، X، MAX.Distance = 33) [1] 1

Linux: R الإصدار 2.9.1 (2009-06-26) X86_64 - غير معروف لينكس-جنو

locale: lc_ctype = en_us.utf-8؛ lc_numeric = c؛ lc_time = en_us.utf-8؛ lc_collate = en_us.utf-8؛ lc_monetary = c؛ lc_messages = en_us.utf-8؛ lc_paper = en_us.utf-8؛ lc_name = c؛ lc_address = c؛ lc_telephone = c؛ lc_measurement = en_us.utf-8؛ lc_didentification = c

agrep (النمط، x، max.distance = 30) [1] 1 agrep (نمط، x، max.distance = 31) [1] 1 agrep (نمط، x، max.distance = 32) [1] 1 agrep ( نمط، x، max.distance = 33) [1] 1

نصائح أخرى

لست متأكدا مما إذا كان مثالك منطقي. بالنسبة إلى GREP الأساسي ()، غالبا ما يكون النمط تعبيرا بسيطا أو منتظما، و X هو متجه الذي يتطابق عنصره إلى نمط. وجود نمط مقدم أطول سلسلة X يضربني غريب.

النظر في هذا حيث نستخدم فقط GREP بدلا من Sercht:

R> grep("vo", c("foo","bar","baz"))   # vo is not in the vector
integer(0)
R> agrep("vo", c("foo","bar","baz"), value=TRUE) # but is close enough to foo
[1] "foo"
R> agrep("vo", c("foo","bar","baz"), value=TRUE, max.dist=0.25) # still foo
[1] "foo"
R> agrep("vo", c("foo","bar","baz"), value=TRUE, max.dist=0.75) # now all match
[1] "foo" "bar" "baz"
R>  
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top