为什么 strsplit 不能处理我的字符串?

Why is strsplit not working with my character string?

我想结合 R 的 rev() 函数和 strsplit 函数来检查字符串是否为回文。我的想法是使用 strsplit() 将我的字符串拆分为单个字母,然后对结果使用 rev 来反转字母的顺序。所以,说:

a = "summer"

我们这样做:

b = strsplit(a,"")

我们得到:

[[1]]
[1] "s" "u" "m" "m" "e" "r"

看起来应该可以。但是在此使用 rev:

rev(b)

并且输出没有改变:

[[1]]
[1] "s" "u" "m" "m" "e" "r"

现在,我已经缩小了与“[[1]]”有关的答案范围,我认为它是列表表示法。如果我们这样做:

c = strsplit(a,"")[[1]]

我们得到:

[1]“s”“u”“m”“m”“e”“r”

即没有'[[1]]'。现在,如果我们在这里使用 rev(c),我们会得到想要的结果:

[1] "r" "e" "m" "m" "u" "s"

类似地,如果我们有:

d = 1:10

并使用 rev(d),我们得到:

[1] 10  9  8  7  6  5  4  3  2  1

两次成功尝试的共同点是缺少列表符号。谁能告诉我 R 如何处理我们的初始字符串,以及为什么使用带有 strsplit 的列表表示法可以让我们正确使用 rev?

这里发生的事情是,当您调用 rev(b) 时,您正在反转一个 list,其中只有一个元素。那一个元素是一个字符向量。所以反向操作只是 returns 同样的事情:

b <- strsplit(a, "")
rev(b)

[[1]]
[1] "s" "u" "m" "m" "e" "r"

但是,当您访问该列表的第一个(也是唯一一个)元素时,您反转了字母向量:

rev(b[[1]])

[1] "r" "e" "m" "m" "u" "s"

如果你对一个包含多个元素的列表进行反转,你会看到元素反转:

lst <- list(a=c("v", "x"), b=c("y", "z"))
lst

$a
[1] "v" "x"

$b
[1] "y" "z"

rev(lst)

$b
[1] "y" "z"

$a
[1] "v" "x"