逻辑取反运算符!是如何工作的?

11

我不是在解决特定问题,而是在尝试学习 R 并理解其逻辑非运算符 "!",该运算符在页面http://stat.ethz.ch/R-manual/R-devel/library/base/html/Logic.html中有文档。

当与 "=" 结合使用时,它对我很有用,例如:

1 != 2
TRUE

但是我还不能完全理解这个运算符的独立应用。例如,我能否使用它来选择列表中没有特定名称的元素。以下是我的尝试,但并没有成功:

vector1 <- 1:5 # just making vector of 5 numbers
vector2 <- 5:1 # same vector backwards
list <- list(Forward=vector1, Backwards=vector2) # producing list with two elements
x = "Forward"
list[!x]

我的输出结果是:

Error in !x : invalid argument type

希望能得到关于以下情况我逻辑出错的任何提示,以及除了不等于(!=)之外这个运算符的其他好用之处。

3个回答

15

首先,最好不要把!=看作是作用于=,而应该将其视为一个独立的二元运算符。

通常情况下,只应用于布尔向量。因此,这可能更接近您想要的:

vector1 <- 1:5 # just making vector of 5 numbers
vector2 <- 5:1 # same vector backwards
l <- list(Forward=vector1, Backwards=vector2) # producing list with two elements
x = "Forward"
l[!(names(l) %in% x)]

names(l) %in% x返回一个布尔向量,指示列表l的名称是否包含在x中。最后,我避免使用list作为变量名,因为您可以看到它也是一个相当常见的函数。


11

我同意其他两位发帖人所说的一切,但是想要再补充一点,在教授R语言时,我总是会告诉学生一个事情。

R的工作方式是从内部到外部逐步评估语句,每个语句都必须单独运行。如果你在内部语句中已经有错误了,那么外部语句就不会产生任何结果。

在你的情况下,可以说你有两个语句:!x 和通过[访问list列表。

如果你复制R的行为,则会注意到 !x 已经产生了错误:

> !x
Error in !x : invalid argument type
因此,正确的解决方案会尝试更改此步骤。
因此:在出现错误时始终检查最内部的语句,并向外逐步解决问题。

8
首先,我认为!=中的!不是!运算符。它是一个独立的!=运算符,表示“不同于”。
其次,!运算符是一个逻辑运算符,适用于逻辑向量,并且它必须被应用于一个逻辑向量:
R> !(c(TRUE,FALSE))
[1] FALSE  TRUE

数字可以被强制转换为逻辑值,并且可以应用于数字向量。在这种情况下,0 将被视为 FALSE,任何其他值将被视为 TRUE

R> !c(1,0,-2.5)
[1] FALSE  TRUE FALSE

在您的示例中,您试图将此逻辑运算符应用于字符字符串,这会引发错误。

如果您想按名称、索引或条件对列表、数据框或向量进行子集操作,您应该阅读并学习 R 语言的索引部分,这在 R 手册和大多数入门书籍和文档中有描述。

例如,通过名称对列表进行子集操作的一种方法是:

R> list[!(names(list) %in% "Forward")]
$Backwards
[1] 5 4 3 2 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接