2013-04-22 167 views
9

我不是想解决任何特定问题,而是试图学习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外,该运算符的用法。

谢谢! 谢尔盖

回答

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返回沿,表明它们是否包含在x或不在名单l的名称的布尔向量。最后,我避免使用list作为变量,因为您可以看到它也是一个相当常见的功能。

+0

乔兰,非常感谢澄清和解释,现在对我来说都是有意义的。 – 2013-04-22 23:06:10

8

首先,我认为!!=不是!运算符。这是一个明显的,!=运营商,这意味着“不同于”。

其次,!操作者是逻辑一,逻辑否定,并且它必须被施加到逻辑矢量:

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

如号码可被强制转换为逻辑,它也可以被应用到数值矢量。在这种情况下0将被视为FALSE和任何其他价值TRUE

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

在您的例子,你想这个逻辑运算符适用于字符串,这引起了一个错误。

如果您想要通过名称,索引或条件对列表,数据框或向量进行子集化,您应该阅读并了解R语言的索引部分,R语言的索引部分将在R手册和大多数入门书籍和文档。以子组名称的列表

的一种方法是,例如:

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

我同意的一切由其他两个海报说,但要加上一句话,就是教R.时,我总是告诉

R的作用在于它从内部到外部评估语句,并且每个语句都需要独立运行。如果你在内部陈述中已经有了一个错误,难怪外人不会产生任何东西。

在你的情况下,人们可以说你有两条语句:!xlist的列表通过[访问。

如果你复制的r行为您发现!x已经产生错误:

> !x 
Error in !x : invalid argument type 

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

因此:当发生错误并且向外工作时,请务必检查最内层的语句。