2014-10-03 4 views
6

내가 하나 하나에 벡터의 요소 내의 모든 복수 (2 개 이상) 공백 문자를 축소하려고했다가 포함 된 문자 벡터, 문제는, gsub()를 사용하여 예 : R 정규식 : NA 그리고

x1 <- c(" abc", "a b c ", "a b c") 
gsub("\\s{2,}", " ", x1) 
[1] " abc" "a b c " "a b c" 

그러나 같은

벡터가 NA을 포함하는 즉시 대체가 실패 :

,682 :

x2 <- c(NA, " abc", "a b c ", "a b c") 
gsub("\\s{2,}", " ", x2) 
[1] NA " " " " " " 

그러나, 하나는 펄과 같은 정규 표현식을 사용하는 경우 잘 작동

R의 정규 표현식이 그런 식으로 행동하는 이유에 대해 제안 된 사람이 있습니까? 도움이된다면 Linux x86-64에서 R 3.1.1을 사용하고 있습니다.

+0

백 슬래시를 더 추가 했습니까? R에서는 매우 까다 롭습니다. 이런 종류의 표현을 인식하려면 일반적으로 세 개가 필요합니다. – Llopis

+0

@Llopis 올바르지 않습니다. 정규식은 실제로'\ s'이며, 하나의 백 슬래시 앞에'\\ s '가옵니다. – jbaums

+0

OS X에서도 확인되었습니다. 리터럴 스페이스 문자 (또는 스페이스/탭 문자 클래스)는 잘 동작하지만'\ s'와'[[: space :]] '는 동작을 나타냅니다. R에서 버그가 있다고 생각하고 있습니다. –

답변

2

useBytes=TRUE 매개 변수 (perl=TRUE 매개 변수없이)를 사용하면 소스 코드를 찔러 보지는 않았지만 작동합니다. 도움말에서 : "useBytesTRUE 일 경우 문자 단위가 아닌 바이트 단위로 일치가 수행됩니다"그 이유는 이것이 실패한 이유 중 하나 일 수 있습니다. gsub.

그러나

, regexpr, regexecgregexpr 각 내가 읽기 쉽도록 [[:space:]]:\\s 교체 만 regexpr 출력을 사용했다 (모든 정확한 위치를 찾습니다.

regexpr("[[:space:]]{2,}", x2) 

## [1] NA 1 1 1 
## attr(,"match.length") 
## [1] NA 5 9 6 

그래서, 정규식 자체는 괜찮

업데이트 : R 3.1.1의 grep.c에있는 do_gsub을 간략히 살펴보면 많은 통찰력을 얻지 못했습니다. (이것은 if/else 문장의 왜곡 된 미로입니다 :-) 나는 거의 cal 이거 버그 야.

+2

무엇? Regex의 버그? 어떻게 알 수 있니? :-) –