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

Dan*_* Öz 1 string r list palindrome strsplit

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

a = "summer"
Run Code Online (Sandbox Code Playgroud)

我们这样做:

b = strsplit(a,"")
Run Code Online (Sandbox Code Playgroud)

我们得到:

[[1]]
[1] "s" "u" "m" "m" "e" "r"
Run Code Online (Sandbox Code Playgroud)

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

rev(b)
Run Code Online (Sandbox Code Playgroud)

并且输出不会改变:

[[1]]
[1] "s" "u" "m" "m" "e" "r"
Run Code Online (Sandbox Code Playgroud)

现在,我已经缩小了答案,使其与“[[1]]”有关,我将其视为列表符号。如果我们这样做:

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

我们得到:

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

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

[1] "r" "e" "m" "m" "u" "s"
Run Code Online (Sandbox Code Playgroud)

同样,如果我们有:

d = 1:10
Run Code Online (Sandbox Code Playgroud)

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

[1] 10  9  8  7  6  5  4  3  2  1
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*sen 5

这里发生的情况是,当您调用 时rev(b),您正在反转一个列表,其中只有一个元素。该元素是一个字符向量。所以相反的操作只会返回相同的结果:

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

[[1]]
[1] "s" "u" "m" "m" "e" "r"
Run Code Online (Sandbox Code Playgroud)

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

rev(b[[1]])

[1] "r" "e" "m" "m" "u" "s"
Run Code Online (Sandbox Code Playgroud)

如果您获取一个包含多个元素的列表并将其反转,您将看到元素反转:

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