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

在这种情况下我的逻辑出错的地方,以及除了 != case 之外,这个运算符还有什么其他好的用途,将不胜感激。

谢谢!谢尔盖

4

3 回答 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)]

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

于 2013-04-22T22:02:23.973 回答
11

我同意其他两张海报所说的一切,但想再补充一件事,我在教 R 时总是告诉我。

R 的工作原理是它从内到外评估语句,并且每个语句都需要自己运行。如果您在内部语句中已经有错误,难怪外部不会产生任何东西。

在您的情况下,可以说您有两个语句:!x并列出list通过 via访问[

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

> !x
Error in !x : invalid argument type

因此,正确的解决方案试图改变这一步。

所以:当错误发生时,一定要检查你内心深处的陈述,并向外努力。

于 2013-04-22T22:25:27.990 回答
8

首先,我认为!in!=不是!运算符。它是一个 distinct!=运算符,意思是“不同于”。

其次,!运算符是逻辑运算符,即逻辑否定,它必须应用于逻辑向量:

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
于 2013-04-22T22:06:14.837 回答