获取和删除字符串的第一个字符

ped*_*rio 92 string r

我想通过为每个字符分配不同的值来使用字符串进行一些二维漫游.我打算'弹出'字符串的第一个字符,使用它,并重复其余的字符串.

我怎样才能实现这样的目标?

x <- 'hello stackoverflow'
Run Code Online (Sandbox Code Playgroud)

我希望能够做到这样的事情:

a <- x.pop[1]

print(a)

'h'
print(x)

'ello stackoverflow'
Run Code Online (Sandbox Code Playgroud)

Ric*_*ton 152

?substring.

x <- 'hello stackoverflow'
substring(x, 1, 1)
## [1] "h"
substring(x, 2)
## [1] "ello stackoverflow"
Run Code Online (Sandbox Code Playgroud)

使用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"
Run Code Online (Sandbox Code Playgroud)


bar*_*nus 10

stringi包中使用此功能

> x <- 'hello stackoverflow'
> stri_sub(x,2)
[1] "ello stackoverflow"
Run Code Online (Sandbox Code Playgroud)


Ton*_*son 9

也有str_sub来自纵梁包

x <- 'hello stackoverflow'
str_sub(x, 2) # or
str_sub(x, 2, str_length(x))
[1] "ello stackoverflow"
Run Code Online (Sandbox Code Playgroud)


Ric*_*ven 7

substring绝对是最好的,但这是另一种strsplit选择,因为我还没有见过.

> x <- 'hello stackoverflow'
> strsplit(x, '')[[1]][1]
## [1] "h"
Run Code Online (Sandbox Code Playgroud)

或者等价的

> unlist(strsplit(x, ''))[1]
## [1] "h"
Run Code Online (Sandbox Code Playgroud)

你可以paste将其余的字符串重新组合在一起.

> paste0(strsplit(x, '')[[1]][-1], collapse = '')
## [1] "ello stackoverflow"
Run Code Online (Sandbox Code Playgroud)


jon*_*jon 5

删除第一个字符:

x <- 'hello stackoverflow'
substring(x, 2, nchar(x))
Run Code Online (Sandbox Code Playgroud)

想法是选择从 2 开始的所有字符到 x 中的字符数。当单词或短语中的字符数不等时,这一点很重要。

选择第一个字母与以前的答案一样微不足道:

substring(x,1,1)
Run Code Online (Sandbox Code Playgroud)