문제

편집하다: 이 버그는 32 비트 버전의 R에서 발견되었습니다. R 버전 2.9.2에서 고정되었습니다.


이것은 오늘 @leoniedu에 의해 나에게 트윗되었고 나는 그에 대한 답이 없어서 여기에 게시 할 것이라고 생각했습니다.

congp () (퍼지 문자열 일치)에 대한 문서를 읽었으며 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-list의 버그로보고했습니다. 나는 유용한 응답이 없었기 때문에 버그가 재현 가능했는지 또는 무언가를 놓치고 있었는지 확인하기 위해 twit습니다. JD Long은 그것을 재현 할 수 있었고 여기에 질문을 친절하게 게시했습니다.

적어도 r에서 동의는 동의하는 것입니다. ~ 아니다 Grep은 정규 표현식과 일치하는 반면 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

동의 (패턴, X, Max.distance = 30) [1] 1

동의 (패턴, x, max.distance = 31) 정수 (0) 동의 (패턴, x, max.distance = 32) 정수 (0) 동의 (패턴, x, max.distance = 33) [1] 1

Linux : R 버전 2.9.1 (2009-06-26) x86_64-unknown-linux-gnu

로케일 : 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_identification = c

동의 패턴, X, 최대 거림 = 33) [1] 1

다른 팁

당신의 예가 의미가 있는지 확실하지 않습니다. 기본 grep ()의 경우 패턴은 종종 단순하거나 정규식이며 X는 요소가 패턴과 일치하는 벡터입니다. x가 더 긴 스트링으로 패턴을 갖는 것은 나를 홀수로칩니다.

Substr 대신 grep을 사용하는 곳을 고려하십시오.

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