我不是要解决任何特定问题,而是试图学习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之外该运算符的其他好用途。
谢谢! 塞吉
答案 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