Получение и удаление первого символа строки
Я хотел бы сделать некоторые двумерные блуждания, используя строки символов, назначая разные значения каждому символу. Я планировал "поп" первый символ строки, использовать ее и повторять для остальной строки.
Как я могу добиться чего-то подобного?
x <- 'hello stackoverflow'
Я хотел бы сделать что-то вроде этого:
a <- x.pop[1]
print(a)
'h'
print(x)
'ello stackoverflow'
Ответы
Ответ 1
См. ?substring
.
x <- 'hello stackoverflow'
substring(x, 1, 1)
## [1] "h"
substring(x, 2)
## [1] "ello stackoverflow"
Идея иметь метод pop
, который возвращает значение и имеет побочный эффект обновления данных, хранящихся в x
, является очень концепцией из объектно-ориентированного программирования. Поэтому вместо определения функции pop
для работы с символьными векторами мы можем сделать ссылочный класс с помощью метода 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"
Ответ 2
Используйте эту функцию из пакета stringi
> x <- 'hello stackoverflow'
> stri_sub(x,2)
[1] "ello stackoverflow"
Ответ 3
substring
определенно лучше, но здесь одна альтернатива strsplit
, так как я еще не видел ее.
> x <- 'hello stackoverflow'
> strsplit(x, '')[[1]][1]
## [1] "h"
или эквивалентно
> unlist(strsplit(x, ''))[1]
## [1] "h"
И вы можете paste
оставить остальную часть строки вместе.
> paste0(strsplit(x, '')[[1]][-1], collapse = '')
## [1] "ello stackoverflow"
Ответ 4
Существует также str_sub
из пакета stringr
x <- 'hello stackoverflow'
str_sub(x, 2) # or
str_sub(x, 2, str_length(x))
[1] "ello stackoverflow"
Ответ 5
удаление первых символов:
x <- 'hello stackoverflow'
substring(x, 2, nchar(x))
Идея - это выбор всех символов, начиная от 2 до числа символов в x. Это важно, когда у вас есть неравное количество символов в слове или фразе.
Выбор первой буквы тривиальным, как предыдущие ответы:
substring(x,1,1)
Ответ 6
Другой альтернативой является использование подвыражений захвата с функциями регулярного выражения regmatches
и regexec
.
# the original example
x <- 'hello stackoverflow'
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))
Это возвращает всю строку, первый символ и "всплывающий" результат в списке длины 1.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
что эквивалентно list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x))))
. То есть он содержит супер-набор желаемых элементов, а также полную строку.
Добавление sapply
позволит этому методу работать для символьного вектора длиной > 1.
# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))
Это возвращает список с совпадающей полной строкой в качестве первого элемента и соответствующими подвыражениями, отмеченными ()
, как следующие элементы. Таким образом, в регулярном выражении '(^.)(.*)'
, (^.)
соответствует первому символу, а (.*)
соответствует оставшимся символам.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
[[2]]
[1] "right back" "r" "ight back"
[[3]]
[1] "at yah" "a" "t yah"
Теперь мы можем использовать метод trusty sapply
+ [
, чтобы вытащить нужные подстроки.
myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back" "t yah"