Obtendo e removendo o primeiro caractere de uma string

Eu gostaria de fazer algumas caminhadas bidimensionais usando strings de caracteres, atribuindo valores diferentes para cada caractere. Eu estava planejando “estourar” o primeiro caractere de uma string, usá-lo e repetir para o resto da string.

Como posso conseguir algo assim?

x <- 'hello stackoverflow' 

Eu gostaria de poder fazer algo assim:

 a <- x.pop[1] print(a) 'h' print(x) 'ello stackoverflow' 

Veja ?substring .

 x < - 'hello stackoverflow' substring(x, 1, 1) ## [1] "h" substring(x, 2) ## [1] "ello stackoverflow" 

A idéia de ter um método pop que retorne um valor e tenha um efeito colateral de atualizar os dados armazenados em x é muito mais um conceito da programação orientada a objects. Então, em vez de definir uma function pop para operar em vetores de caracteres, podemos criar uma class de referência com um método pop .

 PopStringFactory < - setRefClass( "PopString", fields = list( x = "character" ), methods = list( initialize = function(x) { x <<- x }, pop = function(n = 1) { if(nchar(x) == 0) { warning("Nothing to pop.") return("") } first <- substring(x, 1, n) x <<- substring(x, n + 1) first } ) ) x <- PopStringFactory$new("hello stackoverflow") x ## Reference class object of class "PopString" ## Field "x": ## [1] "hello stackoverflow" replicate(nchar(x$x), x$pop()) ## [1] "h" "e" "l" "l" "o" " " "s" "t" "a" "c" "k" "o" "v" "e" "r" "f" "l" "o" "w" 

Use esta function do pacote stringi

 > x < - 'hello stackoverflow' > stri_sub(x,2) [1] "ello stackoverflow" 

substring é definitivamente melhor, mas aqui está uma alternativa de strsplit , desde que eu não vi um ainda.

 > x < - 'hello stackoverflow' > strsplit(x, '')[[1]][1] ## [1] "h" 

ou equivalente

 > unlist(strsplit(x, ''))[1] ## [1] "h" 

E você pode paste o restante da string novamente.

 > paste0(strsplit(x, '')[[1]][-1], collapse = '') ## [1] "ello stackoverflow" 

Há também str_sub do pacote stringr

 x < - 'hello stackoverflow' str_sub(x, 2) # or str_sub(x, 2, str_length(x)) [1] "ello stackoverflow" 

removendo os primeiros caracteres:

 x < - 'hello stackoverflow' substring(x, 2, nchar(x)) 

A idéia é selecionar todos os caracteres, começando de 2 até o número de caracteres em x. Isso é importante quando você tem um número desigual de caracteres em palavras ou frases.

Selecionar a primeira letra é trivial como respostas anteriores:

 substring(x,1,1) 

Outra alternativa é usar a captura de subexpressões com as expressões regulares de expressões de expressão e regexec .

 # the original example x < - 'hello stackoverflow' # grab the substrings myStrings <- regmatches(x, regexec('(^.)(.*)', x)) 

Isso retorna a string inteira, o primeiro caractere e o resultado "popped" em uma lista de comprimento 1.

 myStrings [[1]] [1] "hello stackoverflow" "h" "ello stackoverflow" 

que é equivalente a list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x)))) . Isto é, contém o super conjunto dos elementos desejados, bem como a cadeia completa.


Adicionar sapply permitirá que este método funcione para um vetor de caracteres de comprimento> 1.

 # a slightly more interesting example xx < - c('hello stackoverflow', 'right back', 'at yah') # grab the substrings myStrings <- regmatches(x, regexec('(^.)(.*)', xx)) 

Isso retorna uma lista com a string completa correspondente como o primeiro elemento e as subexpressões correspondentes capturadas por () como os elementos a seguir. Portanto, na expressão regular '(^.)(.*)' , (^.) Corresponde ao primeiro caractere e (.*) Corresponde aos caracteres restantes.

 myStrings [[1]] [1] "hello stackoverflow" "h" "ello stackoverflow" [[2]] [1] "right back" "r" "ight back" [[3]] [1] "at yah" "a" "t yah" 

Agora, podemos usar o método sapply + [ trusty sapply para extrair as substrings desejadas.

 myFirstStrings < - sapply(myStrings, "[", 2) myFirstStrings [1] "h" "r" "a" mySecondStrings <- sapply(myStrings, "[", 3) mySecondStrings [1] "ello stackoverflow" "ight back" "t yah"