当前位置: 首页 > 知识库问答 >
问题:

与==比较字符串的意外结果

屠杰
2023-03-14

我有两个向量:

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

b = strsplit("polo","")[[1]]
[1] "p" "o" "l" "o"

我试图使用=比较它们。不幸的是,a==b给出了一个意想不到的结果。

a==b
[1]  TRUE  TRUE FALSE  TRUE

虽然我希望:

[1]  TRUE  TRUE FALSE  FALSE

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

这个问题似乎与这样一个事实有关,即两个向量的最后一个元素与将b更改为例如polf确实给出了预期的结果相同,并且还因为将b设置为puo给出TRUE FALSE TRUE而不是TRUE TRUE TRUE

编辑

换句话说,我希望丢失的元素(当长度不同时)作为零传递(只有似乎给出真假NANULL给出不同的结果)。

c("p","o","","")==c("p","o","l","o")
[1]  TRUE  TRUE FALSE FALSE

共有2个答案

盖嘉珍
2023-03-14

为了得到OP中显示的结果,我们可以将两个向量放入列表中,调整它们的长度s至maximum长度(通过添加NA的),并测试比较是否为%真

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

注:R版本4.1。2(2021-11-01)

数据:

a <- c("p", "o")
b <- c("p", "o", "l", "o")
国阳
2023-03-14

你在这里遇到的问题是由于回收(不是环保型的)。当对要求长度相同的两个向量应用操作时,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

我不太清楚为什么你会期望结果是TRUE-FALSE-FALSE,因为比较length-2向量和length-4向量有点模棱两可,循环使用length-2向量(这就是R所做的)似乎是除了抛出错误之外最合理的默认值。

 类似资料:
  • 问题内容: 我注意到我正在编写的Python脚本表现得很松散,并将其追溯到无限循环,其中循环条件为。在调试器中运行它,结果发现那条线实际上是。当我将其更改为!=’‘而不是时,它工作正常。 另外,即使比较或值,通常还是最好还是默认使用吗?我一直喜欢使用,因为我发现它在美学上更令人愉悦和pythonic(这就是我陷入这个陷阱的方式…),但是我想知道是否打算仅在你关心找到两个对象时才保留它?具有相同ID

  • 问题内容: 我试图比较2个1000字节的字符串,并想知道差异的确切位置,即;字符串与哪个字节不同。.是否有任何函数可以确定它? 问题答案: 我试图测试此处给出的答案,并且提出了另一个 更快 (通常情况下)的解决方案,尽管它不太优雅。 首先,让我们看看所提出的解决方案有多快: 如您所见,genexp比快很多,但这可能是由于它比查找第一个非等号字符要好得多。 现在,我们如何加快速度?好吧,我们可以使用

  • 我已经声明了一个实现可比较接口和compareTo方法的类,使用employee ID比较两个员工。创建的类对象插入数组列表。现在,当我使用collections.sort(arrayList对象)时,它工作得很好。我对collective和comparator接口之间的比较有何不同感到困惑。我想知道如何在纯粹由数字组成的employee id字符串和其他字符串employee id之间进行比较,

  • 问题内容: 我不知道以下行为, 以上语句的输出如下: 假 str1 == str2是 为什么会这样呢?为什么输出不是这样的: str1 == str2是 str1 == str2是 问题答案: 的优先级高于。 所以你的代码: 将有效地 因此,您得到了。 在情况2 您已显式使用花括号与(是)进行比较,然后附加值。

  • 问题内容: 我想用几行代码来说明Java中要比较两个字符串(),必须使用而不是operator 。 这是我尝试过的东西: 我期待的输出是:,因为在测试中,我实际上是在比较两个引用(即地址)而不是对象的内容。 但事实上,我这样的输出:! 浏览我发现,一些Java实现将优化上述代码,以便在互联网和 将 实际引用相同的字符串。 好吧,当在Java中比较字符串(或对象)时,如何使用运算符演示问题? 问题答

  • 我试图理解String#intern方法。现在,这引起了更多的混乱。 上面的代码打印为true。如果我注释第3行并取消注释第5行,则打印为false 对于第3行,将检查SCP,并将字符串添加到SCP中。但在这种情况下,s2如何等于s4呢 s2仍在引用堆中指向SCP常量的对象。正当 有人能解释一下发生了什么吗?我已经经历了不同的SO问题,但仍然无法理解。 EDIT 我只是想了解实习生方法。我知道b/