2014-10-30 15 views
3

문자열을 가져와 한 문자를 다른 문자로 바꾸는 함수를 작성하려고하지만이 문자를 바꾸는 모든 순열을 반환하고 싶습니다. 모든 i를 l로 바꾸고 싶습니다.하지만 gsub에서와 같이 전 세계적으로하고 싶지 않으며 하위의 첫 번째 작업 만하고 싶지 않습니다. 나는 그것을 보여주는 예제가 가장 좋다고 생각한다. 나는 (이 난의에) 이름 keviin에 전달하는 경우 :Rstats 문자열의 한 자리에서 한 문자를 바꾸는 방법

thisFunction("keviin") 
[1] kevlin keviln kevlln 

를 그래서 다시 우선, 두 번째 난 후, 나는 양쪽의 교체 얻을. 이것은 재귀를위한 일처럼 들리지만, 먼저 첫 번째 i를 어떻게 바꾸는 지 알아 내야합니다. 그런 다음 결과 문자열을 함수에 전달하여 다음 순열을 얻을 수 있습니다.

아무에게도 푸시 아이디어가 있습니까? 나는이 일을 시도했지만 나를 위해 작동하지 않았다 :

> substr("keviin",4,4) <- "l" 
Error in substr("keviin", 4, 4) <- "l" : 
    target of assignment expands to non-language object 

답변

1

:

thisFunction<-function(x) { 
    xsplit<-strsplit(x,"")[[1]] 
    ipos<-as.vector(gregexpr("i",x)[[1]]) 
    if (length(ipos)==1) { 
    if (ipos<0) return(x) else { 
     substring(x,ipos,ipos)<-"l" 
     return(x) 
    } 
    } 
    combos<-unlist(lapply(seq_along(ipos),combn,x=ipos,simplify=FALSE),recursive=FALSE) 
    ret<-t(vapply(combos,function(x) {xsplit[x]<-"l";xsplit},character(length(xsplit)))) 
    do.call(function(...) paste(...,sep=""),as.data.frame(ret)) 
} 

    thisFunction("keviin") 
    #[1] "kevlin" "keviln" "kevlln" 
+0

이것은 내 고문 테스트 "keviinandinandfoiiiiquerbar"에서 효과가있는 것 같습니다. 내 대답에 대한 나의 메모에 따르면, 나는'2^7 - 1' 결과를 기대했으며 실제로 127이되었다. –

0

정규식과 벡터에서 샘플링을 결합하는 방법은 어떻습니까?

kevsplit<-unlist(strsplit('keviin','')) 
the_eyes <-which(grepl('i',kevsplit)) 
kevsplit[sample(the_eyes,1)] <-"L" 
newkev<-paste(kevsplit,collapse='') 

"i"중 하나를 무작위로 바꿉니다. , 모든 가능한 순열을 교체하기 위해 마지막 비트 편집

:-)이 있음을 쓰는 내가 너무 게으른 해요

for(j in 1:length(the_eyes)) { 
     calculate all permutations of the_eyes taken j at a time 
     swap those selected values to kevsplit and save in some list 
     } 

그런 짓을 : 다시 함께 다시 붙여 물건을 제외하고, 명확히하기 위해 문제는 기본적으로 다음과 같습니다.

"i"를 0 또는 논리적 FALSE로 바꾸는 c (0,0,0,0,0, ....) 유형의 벡터의 경우 1을 또는 "TRUE"(또는 1)의 값이 더 많습니까? 그건 입문 조합론의 표준적인 문제입니다. 그리고 우리에게 행복하게 충분할만큼 컴퓨터를 사용하는 사람들은 바이너리로 계산됩니다.

-1

이 어떤 이유로

thisFunction <- function(x){ 
+  
+  substr(x,4,4) <- 'l' 
+  return(x) 
+  
+ } 
> thisFunction('keviin') 
[1] "kevlin" 

작품 따옴표의 객체가 아닌 순수 문자열과 함께 작동합니다.

이것에 대해 어떻게 @CarlWitthoft 아이디어에서
+0

그는 하나 개의 입력 "keviin"에 대한 3 문자열을 반환하는 기능을 원하는 –

+0

그는 하나 개의 문자를 대체하는 기능을 원했던 ... 그는 문자 그대로 말했다 "하지만 처음에는 처음 것만 바꾸는 법을 알아야합니다." 그는 전체 솔루션을 요구하지 않았고, 그는 단지 한 캐릭터를 먼저 교체 한 다음 나머지는 스스로 할 수 있기를 원했습니다. – jtanman

+0

만약 그가 전체 함수를 원한다면 그는 "한 문자열에서 한 문자를 대체하는 방법"이 아닌 한 문자를 바꾸는 모든 순열을 반환하는 함수를 작성하는 방법을 말했다. – jtanman