如何在字符串中替换某个位置的单个字符

4

我正在尝试编写一个函数,它将接受一个字符串并将一个字符替换为另一个字符,但我希望它返回替换该字符的每个排列组合。我想用l替换每个i,但我不想像在gsub中全局替换,也不想像在sub中只替换第一个。我认为通过示例最能说明问题。如果我传入名称keviin(有两个i):

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

所以我需要替换第一个i,第二个i还有两个i都替换的情况。这听起来像是递归的工作,但首先我需要弄清如何仅替换第一个i。然后我可以将结果字符串传递给函数以获取下一个排列。

有没有人能给我一点提示?我尝试过这个方法,但对我来说不起作用:

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

1
从@CarlWitthoft的想法来看,这样怎么样:
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"

这似乎适用于我的压力测试“keviinandinandfoiiiiquerbar”。根据我的答案笔记,我预计会得到2^7 - 1个结果,实际上得到了127个。 - Carl Witthoft

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
       }

我太懒了,不想写出最后一部分 :-)

编辑:为了澄清,除了将事物粘回到一起,你的问题基本上是:

对于一个类型为c(0,0,0,0,0,....)的向量(用0或逻辑FALSE替换你的“i”),你有多少种方法可以用“TRUE”(或1)替换1个或多个值?这是入门组合数学中的标准问题——对于我们计算机迷来说,这恰好是二进制计数!


-1

这个程序可以处理对象,但是对于纯引号中的字符串就不行,原因未知。

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

运作正常。


他希望该函数针对一个输入“keviin”返回3个字符串。 - Andrew Cassidy
不,他想要这个函数替换一个字符...他确实说过“但首先我需要弄清楚如何仅替换第一个i”。他并没有要求整个解决方案,他只是想先能够替换一个字符,然后自己完成其余部分。 - jtanman
如果他想要整个函数,他会说如何编写一个函数来返回替换一个字符的每个排列,而不是“如何在字符串中替换单个字符”。 - jtanman
他说thisFunction("keviin")应该返回[1] kevlin keviln kevlln。你说得对,他没有明确说明。 - Andrew Cassidy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接