将字符串与“==”进行比较出现意外结果

Maë*_*aël 19 string r string-comparison

我有两个向量:

a = strsplit("po","")[[1]]
[1] "p" "o"

b = strsplit("polo","")[[1]]
[1] "p" "o" "l" "o"
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 来比较它们==。不幸的是,a==b给出了意想不到的结果。

a==b
[1]  TRUE  TRUE FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)

虽然我期望有:

[1]  TRUE  TRUE FALSE  FALSE
Run Code Online (Sandbox Code Playgroud)

那么,是什么原因造成这种情况呢?怎样才能达到预期的效果呢?

该问题似乎与以下事实有关:两个向量的最后一个元素与更改b为 egpolf确实给出了预期结果相同,并且还因为设置bpooo给出了TRUE TRUE FALSE TRUE而不是TRUE TRUE TRUE TRUE

编辑

换句话说,我希望丢失的元素(当长度不同时)作为空值传递(似乎只""给出TRUE TRUE FALSE FALSE,NANULL给出不同的结果)。

c("p","o","","")==c("p","o","l","o")
[1]  TRUE  TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

Dan*_*tor 19

您在这里遇到的问题是由于回收(而不是环保型)造成的。当对两个向量应用要求它们具有相同长度的运算时,R 通常会自动循环或重复较短的向量,直到它足够长以匹配较长的向量。您意想不到的结果是由于 R 将向量回收c("p", "o")为长度 4(较大向量的长度)并将其本质上转换为c("p", "o", "p", "o"). 如果我们进行比较c("p", "o", "p", "o")c("p", "o", "l", "o")我们可以看到我们得到了上面意想不到的结果:

c("p", "o", "p", "o") == c("p", "o", "l", "o")
#> [1]  TRUE  TRUE FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)

我不太清楚为什么你会期望结果是TRUE TRUE FALSE FALSE,因为将长度 2 向量与长度 4 向量进行比较,并回收长度 2 向量(这就是 R 正在做的事情)有点不明确)似乎是除了抛出错误之外最合理的默认值。

  • 我编辑了我的答案以使其更清楚。我希望“l”和“o”在某种程度上可以与任何东西进行比较,所以基本上总是返回“F”。 (2认同)

jay*_*.sf 6

为了获得 OP 中显示的结果,我们可以将两个向量放入 a 中list,将它们的lengths 调整为maximum lengths(通过添加NA's)并测试比较是否为%in% TRUE

list(a, b) |>
  (\(.) lapply(., `length<-`, max(lengths(.))))() |>
  (\(.) do.call(\(x, y, ...) (x == y) %in% TRUE, .))()
# [1]  TRUE  TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

笔记: R version 4.1.2 (2021-11-01)


数据:

a <- c("p", "o")
b <- c("p", "o", "l", "o")
Run Code Online (Sandbox Code Playgroud)