如何逻辑否定运算符“!”作品

时间:2013-04-22 21:51:57

标签: r statistics logical-operators

我不是要解决任何特定问题,而是试图学习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

我会理解在这种情况下我的逻辑出错的地方的任何提示,以及除了!= case之外该运算符的其他好用途。

谢谢! 塞吉

3 个答案:

答案 0 :(得分:13)

首先,最好不要将!=视为! =,而应视为单独的二元运算符。

通常,!只应用于布尔向量。所以这可能更像你的追求:

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作为变量,因为你可以看到它是一个相当常见的函数。

答案 1 :(得分:10)

我同意其他两张海报所说的一切,但是在教R时我想再加一句。

R的工作原理是它评估从内到外的语句,每个语句都需要自己运行。如果你的内部陈述中已经有错误,那么难怪这些outers不会产生任何东西。

在您的情况下,可以说您有两个声明:!x并通过list[上对列表进行访问。

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

> !x
Error in !x : invalid argument type

因此,正确的解决方案会尝试更改此步骤。

所以:在发生错误时始终检查您最内层的陈述并向外工作。

答案 2 :(得分: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